比较以仅获取列上值已更改的行

比较以仅获取列上值已更改的行

给定以下两个 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=> 文件包含要查找的字符串

相关内容