2つのCSVファイルのデータ比較

2つのCSVファイルのデータ比較

3つのファイルがあります。

file1次のデータがあります。

id,name,age
1,jj,60
2,kk,45
3,ss,56

file2次のデータがあります。

id,name,age
1,jj,60
2,kk,44
3,ss,55
4,tt,66

file3フィールドは1つだけです。 IDは次のとおりです。

id
1
2
3

file1今&file2の対応するIDを比較したいと思いますfile3

出力は次のようになります。

id  file1   file2
2   age=45  age=44
3   age=56  age=55

答え1

拡大するpaste+awk解決策:

awk -F',' -v ids=$(paste -s -d'|' <(tail -n+2 file3)) \
'BEGIN{ OFS="\t"; print "id", ARGV[1], ARGV[2] }
 FNR==1{ next }
 NR==FNR{ if ($1 ~ "^("ids")$") a[$1$2]=$3; next }
 ($1$2 in a) && a[$1$2] != $3{ 
     printf "%d\tage=%d\tage=%d\n", $1, a[$1$2], $3 
 }' file1 file2

出力:

id  file1   file2
2   age=45  age=44
3   age=56  age=55

答え2

Romanの答えは素晴らしく、要求された正確な結果を提供します。

しかし、ただ生データが必要です(つまり、CSVヘッダーがなく、printfもなく、印刷された形式)。paste+++を使用できます。commgrepプロセスの交換:

$ paste <(comm -1 -3 file1 file2) <(comm -2 -3 file1 file2) | 
    grep -f <(sed -e 's/^/^/; s/$/,/;' file3)
2,kk,44 2,kk,45
3,ss,55 3,ss,56

説明する:

comm -1 -3 file1 file2固有ラインを出力しますfile2comm -2 -3 file1 file2固有ラインを出力しますfile1。両方のコマンドの出力は、pasteプロセス置換によって提供され、一緒に接続されます。

pasteその後、出力はgrepにパイプされ、リストされているIDと一致する行のみが出力されますfile3。ここでは、プロセス置換を使用して、file3にリストされているIDを行の先頭にあり、後にカンマがある場合にのみID番号と一致する固定正規表現に変換します。

追加の処理が必要な場合や必要な場合は、次のことを行うのが最も便利です。今後かわいいプリント。

関連情報