我有 2 个文件。
File1 内容如下所示:
000000513609200,238/PLMN/000100
000000513609200,238/PLMN/000200
000050354428060,238/PLMN/000200
000050354428060,238/PLMN/000100
001212131415120,238/PLMN/000100
...
...
文件2内容:
000000513609200,238/PLMN/000100
000000513609200,238/PLMN/000200
000050354428060,238/PLMN/000200
000050354428060,238/PLMN/000100
001212131415120,238/PLMN/000100
...
...
File1 有近 15000 条记录,file2 有近 20000 条记录。我想查找仅存在于文件 1 或文件 2 中的行(记录)。我正在使用以下内容:
comm -3 <(sort file1) <(sort file2) > file6
这是一个不错的选择吗?
还有排序如何与这些记录一起工作?它将如何理解将哪一列作为主键?
您还可以建议一个简单的 awk 脚本来比较 file1 和 file2,并将仅存在于 file1 或仅存在于 file2 中的行转发到 file7,以便我可以比较输出。我想确保我的comm
产生相同的结果。
使用 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; }
这将使用 -u(唯一)标志进行排序,并删除任一文件中的所有重复项。
sort -u file1 file2 > file6
如果我理解正确,要简单地根据任何"列"对行进行排序,您可以:
sort file1 file2 -t '/' -k 3 > file6
其中 -t '/' 指定列分隔符,-k 3 指定基于此分隔符的列号。
至于第二个问题,如果您只想比较文件,请尝试使用 diff 命令,看看它是否对您有帮助。
如果文件已排序(或可以即时排序),您也可以尝试加入。 由于您没有良好的测试输入,因此我在玩具示例中显示
$ 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