Linux 从2个巨大的文本文件中提取匹配和不同
我有两个大的文本文件Linux 从2个巨大的文本文件中提取匹配和不同,linux,Linux,我有两个大的文本文件 file1: aaa@email.com bbb@email.com ccc@email.com ddd@email.com ... file2: abc@email.com bbb@email.com cnd@email.com sds@email.com ... 我想显示以下内容: 将文件1和文件2之间的电子邮件与文件3匹配 文件1到文件4中的电子邮件不匹配 文件5中的文件2中的电子邮件不匹配 使用排序和加入。请参见下面利用进程替换的bash示例 join -o 1
file1:
aaa@email.com
bbb@email.com
ccc@email.com
ddd@email.com
...
file2:
abc@email.com
bbb@email.com
cnd@email.com
sds@email.com
...
我想显示以下内容:
使用
排序
和加入
。请参见下面利用进程替换的bash示例
join -o 1.1 <(sort file1) <(sort file2) > file3
join -o 1.1 -v 1 <(sort file1) <(sort file2) > file4
join -o 2.1 -v 2 <(sort file1) <(sort file2) > file5
join-o 1.1单向与awk
:
awk '
NR==FNR {
a[$0]++;
next
}
($0 in a) {
delete a[$0];
print > "file3";
next
}
!($0 in a) {
print > "file4";
next
}
END {
for (x in a)
print x > "file5"
}' file1 file2
测试:
$head文件*
==>file1 file2 file1 file2 file3 file4 file5假设file1和file2都已排序:
comm -12 file1 file2 > file3
comm -23 file1 file2 > file4
comm -13 file1 file2 > file5
假设它们没有排序,而您使用的是bash
:
comm -12 <(sort file1) <(sort file2) > file3
comm -23 <(sort file1) <(sort file2) > file4
comm -13 <(sort file1) <(sort file2) > file5
comm-12另一个选项,使用comm
comm
希望对其输入进行排序,因此您可以提前(最有效)或动态地对文件进行排序。如果文件已排序
comm -12 file1 file2 > file3
将为您提供file1
和file2
共有的行,并将它们放在file3
中。如果它们未排序(并且由于某些原因无法排序),请使用此版本向comm
提供排序输入,而不更改文件:
comm -12 <(sort file1) <(sort file2) > file3
或
comm-23不确定我是否做错了什么,当我手动检查时,输出文件3显示为空(零字节),有一些匹配thought@user2522209,您的输入文件是否每行包含一个电子邮件地址,并且没有空格?请注意join
和sort
以及区域设置。对文件调用sort
的正确方法是LC\u ALL=C sort myfile
。像en_US
这样具有疯狂排序顺序的区域设置将给您带来困难。
comm -12 <(sort file1) <(sort file2) > file3
comm -23 file1 file2 > file4
comm -13 file1 file2 > file5
comm -23 <(sort file1) <(sort file2) > file4
comm -13 <(sort file1) <(sort file2) > file5