grep 较大文件中的名称和信息列表

grep 较大文件中的名称和信息列表

我有两个文件:一个包含名称列表(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

相关内容