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

问题描述 投票:0回答:3

我有一个表文件,如:

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

并且想法只是在qzxswpoi之后删除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 ":"可以工作但不是特定于列。

bash tabular
3个回答
2
投票

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

_species_strand_H.m8

将完成这项工作:“从第二栏中删除awk 'sub(/:.*/,"",$2)+7' file


1
投票

我喜欢Perl这样的东西:

:.*

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


1
投票

你可以很容易地用cat inputfile | perl -ne '@in=split(/\s/);$in[1]=~s/:(.*)$//;print(join(" ",@in));print "\n"' 做到这一点:

sed

括号内的部分匹配第一列,第一列和第二列之间的空白,以及第二列的部分直到(但不包括)sed -r 's/^(\S+\s+[^:[:space:]]+):\S+/\1/g' filename 字符。 :匹配第二列的其余部分。然后,只用括号内的部分替换该行的整个匹配部分,该部分由:\S+表示。

© www.soinside.com 2019 - 2024. All rights reserved.