Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从2个巨大的文本文件中提取匹配和不同_Linux - Fatal编程技术网

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
...
我想显示以下内容:

  • 将文件1和文件2之间的电子邮件与文件3匹配
  • 文件1到文件4中的电子邮件不匹配
  • 文件5中的文件2中的电子邮件不匹配

  • 使用
    排序
    加入
    。请参见下面利用进程替换的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