0

文字列のセットがあります。たとえば、(list.txt)は次のとおりです。

 1abc_A
 2pqr_X
 4ghi_Z

次のようなテキストファイル(test.txt)もあります。

1abc_A    2pqr_X    0.55       0.87
2pqr_X    3def_Y    0.21       0.24
4ghi_Z    1abc_A    0.98       0.75
2pqr_X    4ghi_Z    0.99       0.76
2pqr_X    2pqr_X    1.00       1.00

1列目と2列目の文字列がlist.txtに含まれる文字列に属するように、test.txtからこれらの行のみを取得する必要があります。

この場合、私の出力は次のようになります。

1abc_A    2pqr_X    0.55       0.87
4ghi_Z    1abc_A    0.98       0.75
2pqr_X    4ghi_Z    0.99       0.76
2pqr_X    2pqr_X    1.00       1.00

つまり、2行目を除くtest.txtのすべての行、2行目の列2であるため、3def_Yはlist.txtで指定された文字列のリストに含まれていません。

どうすればawkでこれを行うことができますか?test.txtは約7GBの大きなテキストファイルであることに注意してください。

この問題を解決するための最速の方法は何ですか?助けてください 。

4

1 に答える 1

3
awk 'NR==FNR{a[$0];next} ($1 in a) && ($2 in a)' list.txt test.txt

list.txtの内容を配列のインデックスとして格納し、test.txtの行ごとに、1番目と2番目のフィールドが両方ともその配列のインデックスであることを確認します。test.txtはメモリに保存されないため、どのサイズのtest.txtでも機能します。

于 2013-01-20T13:48:47.460 に答える