我有两个文件:一个包含名称列表(500 个条目),另一个文件包含 A.txt 中每个条目的更多信息以及额外的条目。
文件 A.txt(每行以(fasta 格式)开头>
,也有空格、数字和特殊字符,但在单行中)
>xyz, B=123
>abc, B=231
>mnp, B=567
文件 B.txt(在下一行中包含 A.txt 中每个条目的一些特定信息,并且比文件 A 具有额外的条目)
>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101
>opq, B=678
101010101010101001
>lmn, B=123
101010100000011
结果
>xyz, B=123
01010101010100101
>abc, B=231
1011110000011100000000
>mnp, B=567
10101
我想从列表 B.txt 中 grep 列表 A.txt 中的条目
谢谢
答案1
假设您只想为每个匹配打印两行,使用 GNU 或 FreeBSD grep,您可以将A.txt
模式列表传递给grep
并告诉它打印匹配后的行。这会在--
每次匹配之间产生额外的行,您可以通过额外调用 grep 轻松删除它们。
grep -A1 -Ff A.txt B.txt | grep -vx -- '--'
如果每个部分的行数不固定,您可以使用 awk。首先读取包含要查找的文本的文件,然后对于B.txt
开始新部分的每一行,根据节头是否在中开始或停止打印A.txt
。
awk -v patterns_file=A.txt '
BEGIN {
while (getline <patterns_file) patterns_array[$0] = 1;
close(patterns_file);
}
/^/ { matching = $0 in patterns_array }
matching { print }
' B.txt