私は単独で使用しませんでしawk
たが、あなたが正しく求めていることの要点を理解していれば、この長いワンライナーでそれを行うべきだと思います...
join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 file1.csv file2.csv | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e '1d' -e 's/^,/"",/' -e 's/,$/,"" /' -e 's/,,/,"",/g'
説明:
- この
join
部分は 2 つの CSV ファイルを取得し、それらを最初の列で結合し ( のデフォルト動作join
)、4 つのフィールドすべてを出力し ( -o 1.1 2.1 1.2 2.2
)、両方のファイルで一致しない行が含まれていることを確認します ( -a 1 -a 2
)。
- その部分はその出力を取得し、実際に一致するかどうかに基づいて
awk
、3 番目と 4 番目の列の組み合わせを or に置き換えます。あなたの例に基づいて、この動作について仮定する必要がありました。 "Match"
"Unmatch"
- この
sed
部分は、出力から "no","loc" ヘッダーを削除し ( -e '1d'
)、空のフィールドを開閉引用符で置き換えます ( -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g'
)。この最後の部分は必要ないかもしれません。
編集: tripleee が指摘するように、2 つの初期ファイルがソートされていない場合、上記は失敗します。これを修正するための更新されたコマンドを次に示します。ヘッダー行をパントし、各ファイルを並べ替えてから結合します...
join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 <( sed 1d file1.csv | sort ) <( sed 1d file2.csv | sort ) | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g'