我有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
...
我想显示以下内容:
答案 0 :(得分:1)
使用sort
和join
。请参阅下面的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)
另一种选择,改为使用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
答案 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