特定の列から目的の値の1つを含む行を取得する方法は?

特定の列から目的の値の1つを含む行を取得する方法は?

特定の列から目的の値の1つを含む行を取得する方法はありますか?たとえば、このようなファイルがある場合

12 a 4
11 f 5
8  b 6
10 x 7

値のリストを含む別のファイルです。

a
b
x

2番目の列にあるファイル2の値の1つを持つファイル1の行のみを取得する方法はありますか?この例のように、出力は次のようになります。

12 a 4
8 b 6
10 x 7

よろしくお願いします。私のファイルはタブで区切られています。

ベストアンサー1

与えられた

$ cat file1 
12      a       4
11      f       5
8       b       6
10      x       7

そして

$ cat file2 
a
b
x

短いAWKスクリプトを使用できます。

$ awk 'FNR == NR {strings[$0]} NR > FNR && ($2 in strings)' ./file2 ./file1
12      a       4
8       b       6
10      x       7

最初のパターン(FNR == NR)は(コマンドラインの最初のファイル引数)にのみ適用されますfile2。アクションは、インデックスが一致する文字列である連想配列を埋めます。

2番目のパターン(NR > FNR && ($2 in strings))は、file1コマンドラインに従うことができる他のファイルの行にのみ適用されます。もし2番目の列は配列のインデックスですstrings。その操作は省略され、デフォルト値はですprint

見つかった文字列にスペースも含めるようにするには、列が単一file1で区切られていると想定し、呼び出しに(または)オプションを追加するだけ<tab>です。-v FS='\t'-F '\t'awk

おすすめ記事