Shell 要比较2个csv文件以获得更新、新记录和已删除记录的计数吗
假设我们有一个文件Shell 要比较2个csv文件以获得更新、新记录和已删除记录的计数吗,shell,unix,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
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
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
第二个文件是xyz.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
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脚本,该脚本将统计新行、更新行和删除行。
我的示例文件很小,但实际文件包含20000多条记录
谢谢你的关注。你可以用它来获得你想要的大部分。它将“更新”视为“删除并插入”
插入: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要求对输入文件进行排序。您可以使用它来获取所需的大部分内容。它将“更新”视为“删除并插入”
插入: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要求对输入文件进行排序。以下是使用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 -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 -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的更深入的示例:
$ 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 -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 -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-如何判断两条记录是否已更改?有主键吗?在第一个文件中,我们有4条记录,经过一些逻辑后,新文件被创建xyz.csv.dat。我们有PK作为第一列。在第一个文件中,我们用一些新值更新了第一行,保持第一列固定。第二行相同。第三行我们有de;第二行和第四行是相同的。新记录被添加到这个新文件10000120,…现在我想计算我已经删除、添加和更新的这些行。您如何判断两条记录是否已更改?有主键吗?在第一个文件中,我们有4条记录,经过一些逻辑后,新文件被创建xyz.csv.dat。我们有PK作为第一列。在第一个文件中,我们用一些新值更新了第一行,保持第一列固定。第二行相同。第三行我们有de;第二行和第四行是相同的。新记录被添加到这个新文件10000120,…现在我想计算我已经删除、添加和更新的这些行