別の列と一致する列をファイルに追加するにはどうすればよいですか?

別の列と一致する列をファイルに追加するにはどうすればよいですか?

ファイル 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$2next

この式は、(2番目のファイルの最初のフィールド)が存在する($1 in ar)かどうかを確認します。$1インデックス配列のar。存在する場合、arこのステートメントによって 2 番目のファイルの 2 番目のフィールドが出力されます{print ar[$1],$2}

($1 in ar)これは、2番目のファイルの$1が一致するかどうかを意味するため重要です。インデックスar。そして、ar最初のファイルの $2 にインデックスが付けられます。したがって、これは$12 番目のファイルが$2最初のファイルと一致するかどうかを確認します。

関連情報