想比较2个csv文件,以获取更新,新记录和已删除记录的数量

时间:2013-09-23 11:40:13

标签: shell unix

假设我们有一个文件abc.csv.dat

100000114,AU79 Attract Mens Deo 150 Ml Can,100000113,AU79 Attract Mens Deo 150 Ml Can,18,_,18,Deo
100000115,AU79 Sauve Mens Deo 150 Ml Can,100000112,AU79 Sauve Mens Deo 150 Ml Can,18,_,18,Deo
100000117,AU79 Altitude Mens Deo 150 Ml Can,100000116,AU79 Altitude Mens Deo 150 Ml Can,18,_,18,Deo
100000119,DU AU79 Bandit Mens Deo 150 Ml Can,100000118,DU AU79 Bandit Mens Deo 150 Ml Can,18,_,18,Deo

第二个文件是xyz.csv.dat

100000114,AU79 Attract Mens Deo 250 Ml Can,100000113,AU79 Attract Mens Deo 250 Ml Can,18,_,18,Deo
100000115,AU79 Sauve Mens Deo 150 Ml Can,100000112,AU79 Sauve Mens Deo 150 Ml Can,18,_,18,Deo
100000119,DU AU79 Bandit Mens Deo 150 Ml Can,100000118,DU AU79 Bandit Mens Deo 150 Ml Can,18,_,18,Deo
100000120,AU79 Altitude Mens Deo 350 Ml Can,100000116,AU79 Altitude Mens Deo 350 Ml Can,18,_,18,Deo

我想使用unix命令比较这两个文件来创建我的unix shell脚本,它将计算新行,更新行和删除的行。 我的示例文件很小,但实际文件包含20,000多条记录。

感谢您的关注。

2 个答案:

答案 0 :(得分:3)

您可以使用comm获取您想要的大部分内容。它将“更新”视为“删除并插入”。

插入:comm -13 abc.csv.dat xyz.csv.dat
删除:comm -23 abc.csv.dat xyz.csv.dat
不变:comm -12 abc.csv.dat xyz.csv.dat

comm要求对输入文件进行排序。

答案 1 :(得分:0)

这是一个使用comm的更深入的例子:

$ comm -3 <(sort abc.csv.dat) <(sort xyz.csv.dat) | sed -e 's/^[ \t]*//' | awk -F , '{if (a[$1]) {print "^"$1","} {a[$1] = $0}}' > data2.txt

- 计算更新的行:

$ cat data2.txt | grep -E -f - xyz.csv.dat | wc -l
1

- 计算已删除的行:

$ cat data2.txt | grep -v -E -f - <(comm -2 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat)) | wc -l
1

- 计算新行:

$ cat data2.txt | grep -v -E -f - <(comm -1 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat)) | wc -l
1

- 列出更新行:

$ cat data2.txt | grep -E -f - xyz.csv.dat
100000114,AU79 Attract Mens Deo 250 Ml Can,100000113,AU79 Attract Mens Deo 250 Ml Can,18,_,18,Deo

- 列出删除行:

$ cat data2.txt | grep -v -E -f - <(comm -2 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat))
100000117,AU79 Altitude Mens Deo 150 Ml Can,100000116,AU79 Altitude Mens Deo 150 Ml Can,18,_,18,Deo

- 列出新行:

$ cat data2.txt | grep -v -E -f - <(comm -1 -3 <(sort abc.csv.dat) <(sort xyz.csv.dat))
100000120,AU79 Altitude Mens Deo 350 Ml Can,100000116,AU79 Altitude Mens Deo 350 Ml Can,18,_,18,Deo