我有一个文件A,其中一列包含如下字符串列表:
ADAMTS9
AIP
....
我想使用文件A中的字符串来grep文件B中包含它们的行,文件B如下所示:
chr13 50571142 50592603 ADAMTS9 21461 +
chr19 50180408 50191707 AIP 11299 +
chr19 50180408 50193000 AIP-S1 6532 -
我用过:
grep -F -i -w -f A B
它能够上面所有3行。但是,我只希望前两行是grep'ed而第三行与AIP-S1并不完全匹配AIP ..
有人可以告诉我如何修复命令吗?
感谢。
答案 0 :(得分:3)
您可以改用awk:
awk 'FNR==NR{a[$1];next} ($4 in a)' A B
chr13 50571142 50592603 ADAMTS9 21461 +
chr19 50180408 50191707 AIP 11299 +
要搜索任何字段:
awk 'FNR==NR{a[$1];next} {for (i=1; i<=NF; i++) if ($i in a) print}' A B
答案 1 :(得分:2)
您正在使用-w
进行全字搜索。麻烦的是,在“AIP-S1”中,“ - ”字符不是一个字符。所以“AIP” 被发现为一个完整的单词。
这个疯狂的命令可以将模式文件转换为包含“类字边界”模式:
$ grep -if <(sed 's/^/\\(^\\|[[:space:]]\\)/; s/$/\\($\\|[[:space:]]\\)/' A) B
chr13 50571142 50592603 ADAMTS9 21461 +
chr19 50180408 50191707 AIP 11299 +