大きなファイルの名前と情報のリストをgrepで確認する

大きなファイルの名前と情報のリストをgrepで確認する

2つのファイルがあります。 1つは名前リスト(500項目)を含み、もう1つはA.txtの各項目に関する追加情報と追加項目を含みます。

ファイルA.txt(各行は(fasta形式)で始まり、>スペース、数字、および特殊文字も含みますが、1行にあります)

>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からリストA.txtのエントリをgrepしたいと思います。

ありがとう

答え1

GNUまたはFreeBSD grepを使用して各一致に対して2行だけを印刷すると仮定すると、パターンのリストを渡し、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

関連情報