如何在unix中比较这两个文件

时间:2014-06-11 16:25:27

标签: shell unix awk grep

我有这些文件,即test1.csv,其中包含

等数据
Paris
London
New York
Brisbane

和test2.csv,它们具有相同的数据但订单不同

London
Paris
Brisbane
New York

我正在比较这两个文件,如果他们相等,我会更新一个标志。但是如何比较这两个文件。?

修改 如果文件包含数字数据,如

0025
0013
0566

按升序对其进行排序的方法是什么?

3 个答案:

答案 0 :(得分:5)

排序然后区分文件:

diff <(sort test1.csv) <(sort test2.csv)

答案 1 :(得分:1)

您可以先对文件进行排序,然后进行比较:

sort file1.csv

但是,上述方法逐行对文件进行排序。如果您的内容在一行中(例如,在一行中有逗号分隔的数值),那么您可能希望首先将它们放在单独的行中。例如:

cat > file1 $ `0025, 0013, 0566` 

cat > file2 $ `0013, 0025, 0566` 

并且您尝试对它们进行排序,它将无效:

sort file1 : $ `0025, 0013, 0566` 

sort file2 : $ `0013, 0025, 0566`  

在这种情况下,一种方法是首先用新行替换逗号(和逗号后的空格):

sed 's/, /\
/g' file1 

然后对结果进行排序(然后进行比较)。

这是我写的bash文件:

#!/bin/bash

clear

sed 's/, /\
/g' file1 > file1_formatted

sed 's/, /\
/g' file2 > file2_formatted

sort file1_formatted > file1_sorted
sort file2_formatted > file2_sorted

comm -3  file1_sorted file2_sorted

答案 2 :(得分:1)

您可以使用diff,也可以对已排序的文件使用comm。假设您使用process substitution进行了Bash,那么:

comm <(sort test1.csv) <(sort test2.csv)

这将仅列出文件1中未缩进的行,仅列在文件2中的行由一个选项卡缩进,以及两个选项卡缩进的行。您可以控制哪些列&#39;通过压制你不想要的东西来显示。例如,要仅显示一个文件中的行而不显示另一个文件中的行,请使用-3来禁止显示第三列:

comm -3 <(sort test1.csv) <(sort test2.csv)

要仅显示在两个文件中找到的行(公共行),请将列1和2抑制为:

comm -12 <(sort test1.csv) <(sort test2.csv)