删除列中的扩展名

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但我很确定只有一个命令行可以做到这一点。

αғs*_*нιη 6

使用 awk:

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 和 awk:

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:

sed 's/.[0-9]*$//' file

sed 's/.[^.]*$//' file
Run Code Online (Sandbox Code Playgroud)

$指向行尾。在第一个 sed 命令中搜索 char(.) 后跟零次或多次出现的数字并用空格替换它们。

在第二个 sed 命令中,删除 (.) 后面的所有内容,并删除 dot(.) 本身。

使用 rev 和 sed:

rev file| sed 's/.*[.]//' |rev
Run Code Online (Sandbox Code Playgroud)

删除 dot(.) 之前的所有内容还包括和删除 . 本身。

使用 grep:

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 和 grep:

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 循环:

while read line; do echo "${line::-2}";done <file
Run Code Online (Sandbox Code Playgroud)

如果每行末尾只有 length=1 的数字并且它们是固定长度的,这将起作用。上述命令删除输入文件中每行末尾的最后两个字符。替代命令是${line%??}.


mkc*_*mkc 3

使用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)