如何从特定列的模式中删除文本

How to remove text from a pattern in a certain column

我有一个 table 文件,例如:

qseqid  sseqid  pident  length  mismatch    gapopen qstart  qend    sstart  send    evalue  bitscore    strand

scaffold    EOG091B09QV:/path/path/Z    xx  a   1:8830-20153    74.3    144 0   1
scaffold    EOG091B09QV:/path/path/A    x   a   1:8830-20153    100.0   93  0   0
scaffold    EOG091B09QV:/path/path/Q    x   a   1:8830-20153    41.3    189 49  3
scaffold    EOG091B09QV:/path/path/U    x   a   1:8830-20153    87.5    48  6   0
scaffold    EOG091B09QV:/path/path/K    x   a   1:8830-20153    100.0   60  0   0

这个想法只是在 sseqid 列中删除 : 之后的文本 并得到:

qseqid  sseqid  pident  length  mismatch    gapopen qstart  qend    sstart  send    evalue  bitscore    strand

scaffold    EOG091B09QV xx  a   1:8830-20153    74.3    144 0   1
scaffold    EOG091B09QV x   a   1:8830-20153    100.0   93  0   0
scaffold    EOG091B09QV x   a   1:8830-20153    41.3    189 49  3
scaffold    EOG091B09QV x   a   1:8830-20153    87.5    48  6   0
scaffold    EOG091B09QV x   a   1:8830-20153    100.0   60  0   0

我知道 cut -f 1 -d ":" 匹配 _species_strand_H.m8 可以工作,但不能在特定列中工作。

在这些方面我更喜欢 Perl:

cat inputfile | perl -ne '@in=split(/\s/);$in[1]=~s/:(.*)$//;print(join(" ",@in));print "\n"'

perl -ne 遍历每个输入行,将行拆分为一个数组,替换第二个元素中的内容并将数组连接在一起。

您可以使用 sed 相当轻松地做到这一点:

sed -r 's/^(\S+\s+[^:[:space:]]+):\S+//g' filename

括号内的部分匹配第一列、第一列和第二列之间的空格以及第二列中直到(但不包括): 字符的部分。 :\S+ 匹配第二列的其余部分。该行的整个匹配部分然后仅替换为括号内的部分,用 .

表示

awk 是处理基于列的文本的不错选择:

awk 'sub(/:.*/,"",)+7' file

将完成这项工作:“从第 2 列中删除 :.*