提取匹配和2个巨大的文本文件不同

时间:2013-06-26 01:12:04

标签: linux

我有2个大文本文件

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. 将file1和file2之间的电子邮件与file3匹配
  2. file1到file4中的不匹配电子邮件
  3. file5中file2中的不匹配电子邮件

4 个答案:

答案 0 :(得分:1)

使用sortjoin。请参阅下面的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

答案 1 :(得分:1)

假设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

答案 2 :(得分:1)

另一种选择,改为使用commcomm希望对输入进行排序,因此您可以预先对文件进行排序(最有效),也可以在运行中对文件进行排序。如果文件已排序,

comm -12 file1 file2 > file3

会为您提供file1file2共有的行,并将它们放在file3中。如果它们没有排序(并且由于某种原因不能),请使用此版本向comm提供排序输入而不更改文件:

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

答案 3 :(得分:0)

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 file*
==> file1 <==
aa@email.com
bbb@email.com
ccc@email.com
ddd@email.com

==> file2 <==
abc@email.com
bbb@email.com
cnd@email.com
sds@email.com

$ 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 file*
==> file1 <==
aa@email.com
bbb@email.com
ccc@email.com
ddd@email.com

==> file2 <==
abc@email.com
bbb@email.com
cnd@email.com
sds@email.com

==> file3 <==
bbb@email.com

==> file4 <==
abc@email.com
cnd@email.com
sds@email.com

==> file5 <==
ccc@email.com
aa@email.com
ddd@email.com