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
+++を使用できます。comm
grep
プロセスの交換:
$ 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
固有ラインを出力しますfile2
。 comm -2 -3 file1 file2
固有ラインを出力しますfile1
。両方のコマンドの出力は、paste
プロセス置換によって提供され、一緒に接続されます。
paste
その後、出力はgrepにパイプされ、リストされているIDと一致する行のみが出力されますfile3
。ここでは、プロセス置換を使用して、file3にリストされているIDを行の先頭にあり、後にカンマがある場合にのみID番号と一致する固定正規表現に変換します。
追加の処理が必要な場合や必要な場合は、次のことを行うのが最も便利です。今後かわいいプリント。