比较ubuntu中的CSV文件

时间:2016-01-07 13:44:06

标签: bash csv

我有两个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字符标识符。任何建议都表示赞赏。

2 个答案:

答案 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