给定以下两个 csv 文件(之前已排序):
文件1
a,1,val1
b,2,val2
c,3,val3
d,4,val4
e,5,val5
f,6,val6
g,7,val7
文件2
a,1,val1
b,2,val2
c,3,val3x
e,5,val5x
g,7,val7
h,8,val8
如何比较并仅获取更改第三列上的值的行?我期待得到这样的东西:
c,3,val3x
e,5,val5x
我必须忽略相等、添加或删除的行,我只关心修改的行。我更喜欢使用linux本机命令,而不是pearl、python等。我在工作中需要处理数千万行的文件,所以我正在寻找性能良好的东西。我尝试使用diff -U 0
,但我想这不是适合这项工作的工具。
答案1
那么awk呢?
$ awk -F, 'NR==FNR{a[$1,$2]=$3; next} ($1,$2) in a && $3 != a[$1,$2]' file1 file2
c,3,val3x
e,5,val5x
如果您需要处理高级 CSV 功能(特别是在带引号的 CSV 字段中嵌入逗号,简单的方法awk -F,
无法处理),那么总是有基于 Python 的 csvkit 工具套件。特别是你可以使用csvsql
:
$ csvsql -H --query '
SELECT file2.* FROM file1 INNER JOIN file2 ON file1.a = file2.a AND file1.b = file2.b
WHERE file1.c != file2.c
' file1 file2 2>/dev/null
a,b,c
c,3,val3x
e,5,val5x
答案2
您可以使用 sed-grep 管道执行以下操作:
$ sed -e 's/$/x/' file1 | grep -xFf - file2
c,3,val3x
e,5,val5x
笔记:-
- 首先准备 file1 数据,以便根据 file2 中的数据进行搜索
-x
=> 全行匹配而不是部分匹配-F
=> 用于字符串匹配而不是正则表达式匹配-f
=> 文件包含要查找的字符串