我有这些文件,即test1.csv,其中包含
等数据Paris
London
New York
Brisbane
和test2.csv,它们具有相同的数据但订单不同
London
Paris
Brisbane
New York
我正在比较这两个文件,如果他们相等,我会更新一个标志。但是如何比较这两个文件。?
修改 如果文件包含数字数据,如
0025
0013
0566
按升序对其进行排序的方法是什么?
答案 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)