ファイル 2 の 2 番目の列の数字に従って、ファイル 1 の最初の列を一致させるにはどうすればよいですか?
ファイルファイル1
k002 25
k004 54
k003 23
ファイルファイル2
25 h
23 j
54 hg
望ましい出力
k002 25 h
k003 23 j
k004 54 hg
どうすればいいのか全く分かりませんし、同様の質問も見つかりませんでした。
awk 'matching {print ... $1, $2}' file1 file2 > file_des
答え1
おそらく次のようなことができます:
awk 'NR == FNR { x[$2]=$1; next} { print x[$1], $0 }' file1 file2
どこ:
FNR
: 現在の入力ファイル内の入力レコード番号。NR
: これまでに確認された入力レコードの合計数。
file1
これは全体をメモリに読み込むことに注意してください。
答え2
元のファイルの順序を維持する必要がない場合は、以下を使用できますjoin
。
# sort the first file:
sort -k2 file1 > nfile1
# Sort the second file:
sort file2 > nfile2
join -1 2 -2 1 -o 1.1,1.2,2.2 nfile1 nfile2 > joined_file
または、@Ed Morton が提案しているように、bash
プロセス置換をサポートする またはその他のシェルを使用する場合は、次の方法で一時ファイルの作成を回避できます。
join -1 2 -2 1 -o 1.1,1.2,2.2 <(sort -k2 file1) <(sort file2)
答え3
使用方法awk
:
awk 'NR==FNR{ar[$2]=$0;next}($1 in ar){print ar[$1],$2}' file1 file2
このコマンドでは、最初のファイルを読み取った後にゼロに設定されるため、最初のファイルに対してのみ機能するNR==FNR
ことが保証されます。式では、インデックスが付けられた配列が作成され、それ以上のアクションは実行されません。{ar[$2]=$0;next}
FNR
{ar[$2]=$0;next}
ar
$2
next
この式は、(2番目のファイルの最初のフィールド)が存在する($1 in ar)
かどうかを確認します。$1
インデックス配列のar
。存在する場合、ar
このステートメントによって 2 番目のファイルの 2 番目のフィールドが出力されます{print ar[$1],$2}
。
($1 in ar)
これは、2番目のファイルの$1が一致するかどうかを意味するため重要です。インデックスのar
。そして、ar
最初のファイルの $2 にインデックスが付けられます。したがって、これは$1
2 番目のファイルが$2
最初のファイルと一致するかどうかを確認します。