0

假设我们有一个文件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 多条记录。

感谢您的关注。

4

2 回答 2

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 要求对输入文件进行排序。

于 2013-09-23T12:21:27.743 回答
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

--count 更新的行数:

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

--count 删除的行数:

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

--count 新行数:

$ 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
于 2013-10-24T21:26:46.473 回答