両方のCSVの列を比較し、一致をマージします。

両方のCSVの列を比較し、一致をマージします。

2つのCSVファイルがあり、2番目のファイルの3番目の列と一致する最初のファイルの最初の列に基づいてマージしようとしています。その行はソートされません。

ファイル1.csv:

android,1,2
osx,2,5

ファイル2.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31
Converting,:Developer::|[E],osx,Exact,,,,8,31
Converting,:Developer::|[E],windows,Exact,,,,8,31

そして、次のようになりたい出力.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

私はすべての例を試しました

awk -F',' 'FNR==NR.....

ここで見つけることができますが、正しく見つけることができないようです。

答え1

joinあなたはこれを使うことができます

join -1 1 -2 3 -t ',' -a 2 -o 2.{1..9} 1.{2..3}  <(sort file1.csv) <(sort file2.csv)

-1-2比較するファイルのフィールドを指定します。一致しない行を印刷する
-tフィールドに使用する区切り文字を指定します。
-a 2<file2>
-o<file>.<field>

答え2

作業に最適なツールおそらくjoinしかし、あなたが言及したので、awkここに別のアプローチがあります。

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2;b[$1]=$3; next}{print $0,a[$3],b[$3]}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

2つの配列を使用aし、b最初のフィールドをfile1キーとして、2番目と3番目のフィールドを値として使用します。FNR==NR{...next}最初のファイルだけが配列に保存されていることを確認してください。次に、2番目のファイルの処理中にファイルの行($0)を印刷し、その後にa配列sumの最初のフィールドに対応する値を印刷しますb-vOFS=","目的の出力形式を取得できるように、出力フィールド区切り記号をコンマに設定します。

またはもう少し神秘的に言えば:

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2","$3;next}{print $0,(a[$3]?a[$3]:",")}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

関連情報