我有两个CSV文件,我需要检查创建,更新和删除。请使用以下示例文件:
ORIGINAL FILE
sku1,A
sku2,B
sku3,C
sku4,D
sku5,E
sku6,F
sku7,G
sku8,H
sku9,I
sku10,J
UPDATED FILE
sku1,A
sku2,B-UPDATED
sku3,C
sku5,E
sku6,F
sku7,G-UPDATED
sku11, CREATED
sku8,H
sku9,I
sku4,D-UPDATED
我正在使用linux comm命令,如下所示:
comm -23 --nocheck-order updated_file.csv original_file > diff_file.csv
它为我提供了所有新创建和更新的行,如下所示
sku2,B-UPDATED
sku7,G-UPDATED
sku11, CREATED
sku4,D-UPDATED
哪个很棒,但如果你仔细观察" sku10,J"已被删除,我不确定检查它的最佳命令/方式。我提供的数据仅仅是演示,文字" sku"实际数据中不存在,但CSV文件中的第一列是唯一的5字符标识符。任何建议都表示赞赏。
答案 0 :(得分:1)
我改为使用join
:
join -t, -a1 -a2 -eMISSING -o 0,1.2,2.2 <(sort file.orig) <(sort file.update)
sku1,A,A
sku10,J,MISSING
sku11,MISSING, CREATED
sku2,B,B-UPDATED
sku3,C,C
sku4,D,D-UPDATED
sku5,E,E
sku6,F,F
sku7,G,G-UPDATED
sku8,H,H
sku9,I,I
然后我将其输入awk
join ... | awk -F, -v OFS=, '
$3 == "MISSING" {print "deleted: " $1,$2; next}
$2 == "MISSING" {print "added: " $1,$3; next}
$2 != $3 {print "updated: " $0}
'
deleted: sku10,J
added: sku11, CREATED
updated: sku2,B,B-UPDATED
updated: sku4,D,D-UPDATED
updated: sku7,G,G-UPDATED
答案 1 :(得分:0)
这可能是一种非常粗暴的方式,但如果您确定每个文件中的值不重复,那么:
cat file1.txt file2.txt | sort | uniq -u
如果每个文件都包含重复的字符串,那么在连接之前可以sort|uniq
。