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 -q,diff -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)
grep与bash进程替换一起使用:
$ 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)