2 つのテキスト ファイルの 2 番目の列を比較し、一致する場合は、2 つのファイルの最初の列を印刷します。

2 つのテキスト ファイルの 2 番目の列を比較し、一致する場合は、2 つのファイルの最初の列を印刷します。

2 つのテキスト ファイルの 2 番目の列を比較し、一致すると、2 つのファイルの最初の列を印刷しようとします。

次のコードを試しましたが、うまくawkいきません

1) awk 'NR==FNR {a[$2]=$2; next} {print $1,a[$1]}' nid8.txt nid9.txt

2) awk 'NR==FNR {a[$2]=$2; next} {print $1, $1 in a}' nid8.txt nid9.txt

サンプルファイル:

nid8.txt:

1000 500
1001 501
1002 502
1003 503
1004 504
1005 505

nid9.txt:

2000 504
2001 502
2002 508
2003 505
2004 500
2005 501

出力:

1000 2004
1001 2005
1002 2001
1004 2000
1005 2003

答え1

ここで使用できますjoin

join -j 2 -o 1.1 2.1 <(sort -nk2,2 nid8.txt) <(sort -nk2,2 nid9.txt)

2つのファイルの2番目のフィールドをキー-j 2として使用します。

-o次のフィールドを出力します。最初
のファイルの最初のフィールド1.1
2 番目のファイルの最初のフィールド2.1

join入力ファイルをソートする必要があるため、数値キーとして使用される2番目のフィールドに入力ファイルをソートしますsort -nk2,2 input


これを使用すると、awk入力をソートする必要はありませんが、最初の入力ファイルをメモリにロードします。

awk '!second_file{ my_array[$2]=$1; next }
     ($2 in my_array) { print $1, my_array[$2] }' nid8.txt second_file=1 nid9.txt

my_array[$2]=$1最初の入力ファイルの最初の列を保存しています。nid8.txtsecond_file変数の値が次に設定されないまで、キーが同じ最初のファイルの2番目の列である場合にのみ1これにより、!second_file式は false と評価され、次の入力に対してブロックは実行されません。

条件を使用して、($2 in my_array)2番目のフィールドが配列に存在することを確認します。私の配列または、存在しない場合は、存在する場合、最初のフィールド$1 (2番目のファイルの)とmy_array[$2]最初のファイルの最初のフィールドを含む同じキー値を印刷します。同じキー

関連情報