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,,