我有一个很长的数据列表,其中有 10 个制表符分隔的列。前两列是 ID。我想检索选定 ID 的行。
我首先重命名选定的 ID,以便每个 ID 都以comp-
.然后我尝试提取第 1 列和第 2 列中都存在选定 ID 的行。
文件:
comp-AA11232.1 GR55896.1
AB55887.1 comp-FR87559.1
comp-AC11232.1 comp-AE55888.1
comp-AC66742.1 comp-AD87559.1
期望的输出:
comp-AC11232.1 comp-AE55888.1
comp-AC66742.1 comp-AD87559.1
我正在使用sed -n '/comp\-.*\tcomp\-.*/p' file
.输出文件是所有符合条件的文件,但不幸的是,输出文件中遗漏了一些具有相同条件的行。
不确定这里发生了什么。任何想法?或者在这种情况下有更好的 grep/awk/sed 方法吗?
答案1
awk -F'\t' '$1 ~/^comp-/ && $2 ~/^comp-/' infile
相同,但从参数传递模式:
awk -F'\t' -v pat='comp-' '$1 ~"^" pat && $2 ~"^" pat' infile
或作为字符串匹配进行比较并仍然从参数传递:
awk -F'\t' -v str='comp-' 'index($1, str)==1 && index($2, str)==1' infile
也可以看看如何找到与模式匹配的文本?以获得其他匹配选项。
答案2
珀尔
perl -MList::MoreUtils=all -F'\t' -lane '
print if all { /^comp-/ } @F[0,1];
' file
sedGNU版本
$ sed -n '/^comp-.*\tcomp-/p' file