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]
最初のファイルの最初のフィールドを含む同じキー値を印刷します。同じキー。