3

我有 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. 文件 1 到文件 4 中的不匹配电子邮件
  3. 文件 5 中文件 2 中的不匹配电子邮件
4

4 回答 4

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
于 2013-06-26T15:43:02.037 回答
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
于 2013-06-26T01:17:43.007 回答
1

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

comm -12 file1 file2 > file3

将为您提供file1和共有的行file2,并将它们放入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
于 2013-06-26T15:46:23.233 回答
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
于 2013-06-26T01:26:59.407 回答