如何从特定列的模式中删除文本
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 列中删除 :.*
。
我有一个 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 列中删除 :.*
。