在Linux中对两个文件进行排序,找到每个文件唯一的行

时间:2016-03-02 18:41:45

标签: linux shell sorting awk

我有2个文件。

File1内容如下:

000000513609200,238/PLMN/000100
000000513609200,238/PLMN/000200
000050354428060,238/PLMN/000200
000050354428060,238/PLMN/000100
001212131415120,238/PLMN/000100
...
...

File2内容:

000000513609200,238/PLMN/000100
000000513609200,238/PLMN/000200
000050354428060,238/PLMN/000200
000050354428060,238/PLMN/000100
001212131415120,238/PLMN/000100
...
...

File1有近15000条记录,file2有近20000条记录。我想找到仅存在于file1或file2中的行(记录)。我使用以下内容:

comm -3 <(sort file1) <(sort file2) > file6

这是一个不错的选择吗?

这些记录的排序究竟如何?它将如何理解哪个列作为主键?

你也可以建议一个简单的awk脚本来进行file1和file2之间的比较,并转发仅存在于file1或仅存在于file2和file7中的行,以便我可以比较输出。我想确保我的comm产生相同的结果。

4 个答案:

答案 0 :(得分:2)

使用awk可以在不进行排序的情况下执行此操作:

awk 'FNR==NR {
   a[$0]
   next
}
{
   if ($0 in a)
      delete a[$0]
   else
      print
}
END {
   for (i in a)
      print i
}' file1 file2

同样地使用grep你也可以使用:

{ grep -vxFf file1 file2; grep -vxFf file2 file1; }

答案 1 :(得分:0)

如果我理解正确,只需根据任何“列”对行进行排序,您可以选择:

sort file1 file2 -t '/' -k 3 > file6

其中 -t'/'指定列分隔符, -k 3 指定基于此分隔符的列号。

关于第二个问题,如果您只想比较文件,请尝试 diff 命令,看看它是否对您有所帮助。

答案 2 :(得分:0)

如果文件已排序(或可以即时排序),您也可以尝试加入。由于您没有很好的测试输入,我会在玩具示例中显示

$ seq 5 > f1
$ seq 3 9 > f2

这会在两个文件中提供常见记录,与comm -12 f1 f2

相同
$ join f1 f2  
3
4
5

这会在两个文件中提供不匹配的记录,与comm -3 f1 f2 | sed 's/^\t//'

相同
$ join -v1 -v2 f1 f2
1
2
6
7
8
9

答案 3 :(得分:0)

使用-u(唯一)标志进行排序,并删除任一文件中的所有重复项。

sort -u file1 file2 > file6