【问题标题】:how to find matching records from 3 different files in unix如何从unix中的3个不同文件中查找匹配记录
【发布时间】:2014-03-12 03:50:44
【问题描述】:

我有 3 个不同的文件。 Test1.txt , Test2.txt & Test3.txt

Test1.txt包含

JJTP@yahoo.com
BBMU@ssc.com
HK@glb.com

Test2.txt包含

SFTY@gmail.com
JJTP@yahoo.com

Test3.txt 包含

JJTP@yahoo.com
HK@glb.com

我希望只查看这 3 个文件中的匹配记录。

所以上面例子中的匹配记录将是 JJTP@yahoo.com 输出应该是

JJTP@yahoo.com

【问题讨论】:

    标签: shell unix sed awk


    【解决方案1】:

    如果每个文件中没有重复的行,则:

    $ awk '++a[$1]==3' test[1-3]
    JJTP@yahoo.com
    

    【讨论】:

    • 如果一行在单个文件中重复三次,可能会产生误报
    • 非常聪明的做法,竖起大拇指。
    • 如果 3 个文件名不同(不是全部都是 test1/2/3),那么我将如何实现呢?
    【解决方案2】:

    这是一个 awk,它混合了 jaypal 和 sudo_o 解决方案。
    它不会给出误报,因为它会测试行的唯一性。

    awk '!a[$1 FS FILENAME]++ && ++b[$1]==3' test*
    JJTP@yahoo.com
    

    如果您有未知数量的文件,这可能是一个选项

    awk '!a[$1 FS FILENAME]++ && ++b[$1]==ARGC-1' test*
    

    ARGC存储awk读取的文件个数+1

    【讨论】:

      【解决方案3】:

      comm 列出两个文件的公共行。只需在前两个文件中找到共同行,然后将输出再次通过管道传输到comm,并找到第三个文件的共同行。

      comm -12 <(sort Test1.txt) <(sort Test2.txt) | comm -12 - <(sort Test3.txt)
      

      【讨论】:

        【解决方案4】:

        以下是您对awk 的处理方式:

        awk '
        FILENAME == ARGV[1] { a[$0]++ }
        FILENAME == ARGV[2] && ($0 in a) { b[$0]++ }
        FILENAME == ARGV[3] && ($0 in b)' file1 file2 file3
        

        输出:

        JJTP@yahoo.com
        

        【讨论】:

          【解决方案5】:

          要查找两个文件中的公共行,可以使用:

            sort Test1.txt Test2.txt | uniq -d
          

          或者,如果您希望保留在 Test1.txt 中找到的顺序,您可以使用:

            while read x; do grep -w "$x" Test2.txt; done < Test1.txt 
          

          对于三个文件,重复这个:

            sort Test1.txt Test2.txt | uniq -d | sort - Test3.txt | uniq -d
          

          或者:

            cat                           Test1.txt       |\
            while read x; do grep -w "$x" Test2.txt; done |\
            while read x; do grep -w "$x" Test3.txt; done
          

          sort 方法假定文件本身没有重复行;如果是这样,您可能需要创建临时文件。

          如果您想使用sed 而不是grep,请尝试sed -n "/^$x$/p"。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-21
            • 1970-01-01
            • 1970-01-01
            • 2020-05-09
            • 1970-01-01
            • 1970-01-01
            • 2015-01-19
            相关资源
            最近更新 更多