我有 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
...
我想显示以下内容:
- 将 file1 和 file2 之间的电子邮件与 file3 匹配
- 文件 1 到文件 4 中的不匹配电子邮件
- 文件 5 中文件 2 中的不匹配电子邮件
我有 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
...
我想显示以下内容:
假设 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
使用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
另一种选择,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
一种方法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