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