【问题标题】:Use a file to extract specified rows from another file使用一个文件从另一个文件中提取指定的行
【发布时间】:2012-12-12 06:41:14
【问题描述】:

输入1:

1    s1
100  s100
90   s90

输入2:

a    1
b    3
c    7
d    100
e    101
f    90

输出:

a    1
d    100
f    90

我知道join 可以做到这一点,但它需要 (1) 对这些公共字段进行排序 (2) 加入后,我需要从 input1 中删除第二列。有没有人对此有更好的解决方案。

【问题讨论】:

    标签: linux shell sed awk


    【解决方案1】:

    这是使用awk的一种方式:

    awk 'FNR==NR { a[$1]; next } $2 in a' file1 file2
    

    结果:

    a    1
    d    100
    f    90
    

    【讨论】:

      【解决方案2】:

      这可能对你有用(GNU sed):

      sed -r 's|(\S+).*|/\\<\1$/p|' input1 | sed -nf - input2
      

      【讨论】:

        【解决方案3】:

        根据您的要求,grep 可能会这样做:

        grep -wFf <(cut -d' ' -f1 input1) input2
        

        输出:

        a    1
        d    100
        f    90
        

        请注意,grep 不能识别列,并且会很乐意匹配它可以匹配的位置。

        【讨论】:

          【解决方案4】:

          据我所知,awk 是更好的解决方案,但由于它已经提供:下面是 perl 解决方案。

          > perl -F -lane '$H{$F[0]}=$F[1];END{%T=reverse(%H);foreach (values %H){if(exists($H{$_})){print $T{$_}." ".$_;}}}' file1 file2
          a 1
          d 100
          f 90
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-10
            • 2018-07-22
            • 1970-01-01
            • 1970-01-01
            • 2021-11-01
            • 1970-01-01
            • 2013-05-15
            • 1970-01-01
            相关资源
            最近更新 更多