use*_*373 5 sed awk text-processing
我有一个这样的文件
ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402.5
ILMN_1343295 CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG NM_002046.3
ILMN_1651209 TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC NM_182838.1
Run Code Online (Sandbox Code Playgroud)
我想从第三列的末尾删除数字扩展名,以便我的输出文件看起来像这样
ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402
ILMN_1343295 CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG NM_002046
ILMN_1651209 TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC NM_182838
Run Code Online (Sandbox Code Playgroud)
我怎样才能在命令行上最好使用awk
?我可以做到这一点,perl
但我很确定只有一个命令行可以做到这一点。
awk -F'.' '{print $1}' file
Run Code Online (Sandbox Code Playgroud)
-F
选项将默认字段分隔符(空格)更改为点(.)。
$1
是字段位置的索引(带有 . 字段分隔符)。
{ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402}.{5}
^^ field index is $1 ^^$2
Run Code Online (Sandbox Code Playgroud)
rev file | awk -F'.' '{print $2}'|rev # reverse characters of each lines,\
print field number 2 with (.) separator \
and reverse the result again
Run Code Online (Sandbox Code Playgroud)
该rev
实用程序将指定的文件复制到标准输出,颠倒每一行中的字符顺序。如果未指定文件,则读取标准输入。
sed 's/.[0-9]*$//' file
sed 's/.[^.]*$//' file
Run Code Online (Sandbox Code Playgroud)
$
指向行尾。在第一个 sed 命令中搜索 char(.) 后跟零次或多次出现的数字并用空格替换它们。
在第二个 sed 命令中,删除 (.) 后面的所有内容,并删除 dot(.) 本身。
rev file| sed 's/.*[.]//' |rev
Run Code Online (Sandbox Code Playgroud)
删除 dot(.) 之前的所有内容还包括和删除 . 本身。
grep -oP '.*(?=\.[0-9])' file
Run Code Online (Sandbox Code Playgroud)
-o, --only-matching 只打印匹配行的匹配(非空)部分, 每个这样的部分都在一个单独的输出线上。 -P, --perl-regexp 将 PATTERN 解释为 Perl 兼容的正则表达式 (PCRE)
(?=pattern)
: Positive Lookahead:正向前瞻结构是一对括号,左括号后跟一个问号和一个等号。
.*(?=\.[0-9])
: (positive lookahead) 匹配所有内容 ( .*
) 后跟一个点 (.) 和任何出现的数字,而不会使模式 ( \.[0-9]
) 成为匹配的一部分。
rev file |grep -oP '(?<=[0-9]\.).*' |rev
rev file |grep -oP '[0-9]\.\K.*' |rev
Run Code Online (Sandbox Code Playgroud)
(?<=pattern)
: 正面回顾。一对括号,左括号后跟一个问号、“小于”符号和一个等号。
(?<=[0-9]\.).*
(positive lookbehind) 匹配后跟任何出现的数字并以点(.)结尾的所有内容。
在第二个 grep 命令中,您可以使用漂亮\K
的代替后视断言。
cut -f1 -d. file
cut -c 1-77 file # Print first 77 characters of each line.
Run Code Online (Sandbox Code Playgroud)
cut - 从文件的每一行中删除部分 -d, --delimiter=DELIM 使用 DELIM 而不是 TAB 作为字段分隔符 -f, --fields=LIST 仅选择这些字段; -c, --characters=LIST 只选择这些字符
while read line; do echo "${line::-2}";done <file
Run Code Online (Sandbox Code Playgroud)
如果每行末尾只有 length=1 的数字并且它们是固定长度的,这将起作用。上述命令删除输入文件中每行末尾的最后两个字符。替代命令是${line%??}
.
使用sed
,您可以执行以下操作:
sed 's/\.[0-9][0-9]*$//' x.txt
Run Code Online (Sandbox Code Playgroud)
假设文件名为x.txt
. 如果要内联修改文件,请使用以下-i
开关:sed
sed -i 's/\.[0-9][0-9]*$//' x.txt
Run Code Online (Sandbox Code Playgroud)
如果要保留原始文件的内容,请使用重定向,如下所示:
sed 's/\.[0-9][0-9]*$//' x.txt > newfile.txt
Run Code Online (Sandbox Code Playgroud)