两个大文件的区别

Lyn*_*nob 15 grep diff sed awk

我有“test1.csv”,它包含

200,400,600,800
100,300,500,700
50,25,125,310
Run Code Online (Sandbox Code Playgroud)

和 test2.csv ,它包含

100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
Run Code Online (Sandbox Code Playgroud)

现在

diff test2.csv test1.csv > result.csv
Run Code Online (Sandbox Code Playgroud)

不同于

diff test1.csv test2.csv > result.csv
Run Code Online (Sandbox Code Playgroud)

我不知道哪个是正确的顺序,但我想要别的东西,上面的两个命令都会输出类似的东西

2 > 100,4,2,1,7
   3 2,3c3,5
   4 < 100,300,500,700
   5 < 50,25,125,310
   6 \ No newline at end of file
   7 ---
   8 > 21,22,23,24,25
   9 > 50,25,125,310
Run Code Online (Sandbox Code Playgroud)

我只想输出差异,因此 results.csv 应该是这样的

100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Run Code Online (Sandbox Code Playgroud)

我试过了diff -qdiff -s但他们没有成功。顺序无关紧要,重要的是我只想看到差异,没有 > 也没有 < 也没有空格。

grep -FvF 在较小的文件上而不是在大文件上做了技巧

第一个文件包含超过 500 万行,第二个文件包含 1300。

所以 results.csv 应该导致 ~4,998,700 行

我也试过grep -F -x -v -f 哪个不起作用。

ter*_*don 21

听起来像是一份工作comm

$ comm -3 <(sort test1.csv) <(sort test2.csv)
100,300,500,700
    100,4,2,1,7
    21,22,23,24,25
    50,25,700,5
Run Code Online (Sandbox Code Playgroud)

如中所述man comm

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)
Run Code Online (Sandbox Code Playgroud)

因此,这-3意味着只会打印其中一个文件所独有的行。但是,它们会根据它们所在的文件缩进。要删除选项卡,请使用:

$ comm -3 <(sort test1.csv) <(sort test2.csv) | tr -d '\t'
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您甚至不需要对文件进行排序,您可以将上述内容简化为:

comm -3 test1.csv test2.csv | tr -d '\t' > difference.csv
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 6

grepbash进程替换一起使用:

$ cat <(grep -vFf test2.csv test1.csv) <(grep -vFf test1.csv test2.csv)
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Run Code Online (Sandbox Code Playgroud)

将输出保存为results.csv

cat <(grep -vFf test2.csv test1.csv) <(grep -vFf test1.csv test2.csv) >results.csv
Run Code Online (Sandbox Code Playgroud)
  • <()bash进程替换模式

  • grep -vFf test2.csv test1.csv 将找到唯一的行 test1.csv

  • grep -vFf test1.csv test2.csv 将找到唯一的行 test2.csv

  • 最后我们总结了结果 cat

或者按照Oli 的建议,您也可以使用命令分组:

$ { grep -vFf test2.csv test1.csv; grep -vFf test1.csv test2.csv; }
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Run Code Online (Sandbox Code Playgroud)

或者只是一个接一个地运行,因为它们都在写入 STDOUT,它们最终会被添加:

$ grep -vFf test2.csv test1.csv; grep -vFf test1.csv test2.csv
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Run Code Online (Sandbox Code Playgroud)