【问题标题】:Compare two file columns (unsorted files)比较两个文件列(未排序的文件)
【发布时间】:2012-09-12 06:06:25
【问题描述】:

输入文件 1

A1  123 AA
B1  123 BB
C2  44  CC1
D1  12  DD1
E1  11  EE1

输入文件 2

A   sad21   1
DD1 124f2   2
CC  123tges 3
BB  124sdf  4
AA  1asrf   5

输出文件

A1  123 AA  1asrf   5
B1  123 BB  124sdf  4
D1  12  DD1 124f2   2

输出文件的制作

我们检查输入文件 1 的第 3 列和输入文件 2 的第 1 列。

如果它们匹配,我们将其打印到输出文件中。

注意:

文件未排序

我试过了:

join -t, A B | awk -F "\t"  'BEGIN{OFS="\t"} {if ($3==$4) print $1,$2,$3,$4,$6}'

但这不起作用,因为文件未排序。所以条件 ($3==$4) 不会一直有效。请帮忙。

【问题讨论】:

    标签: bash unix sed awk


    【解决方案1】:
    nawk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2
    

    测试如下:

    > cat file1
    A1      123     AA
    B1      123     BB
    C2      44      CC1
    D1      12      DD1
    E1      11      EE1
    > cat file2
    A       sad21   1
    DD1     124f2   2
    CC      123tges 3
    BB      124sdf  4
    AA      1asrf   5
    > awk 'FNR==NR{a[$3]=$0;next}{if($1 in a){p=$1;$1="";print a[p],$0}}' file1 file2
    D1      12      DD1  124f2 2
    B1      123     BB  124sdf 4
    A1      123     AA  1asrf 5
    >
    

    【讨论】:

      【解决方案2】:

      可以使用join,但您需要先对关键字段进行排序并告诉join第一个文件中的关键是第3列(-1 3):

      join -1 3 <(sort -k 3,3 file1) <(sort file2)
      

      将为您提供正确的字段,输出(column -t 用于输出格式):

      AA   A1  123  1asrf   5
      BB   B1  123  124sdf  4
      DD1  D1  12   124f2   2
      

      要获得问题中列出的相同列排序,您需要指定输出格式:

      join -1 3 -o 1.1,1.2,1.3,2.2,2.3 <(sort -k 3,3 file1) <(sort file2)
      

      即文件 1 的字段 1 到 3,然后是文件 2 的字段 2 和 3。输出(再次使用 column -t):

      A1  123  AA   1asrf   5
      B1  123  BB   124sdf  4
      D1  12   DD1  124f2   2
      

      【讨论】:

        【解决方案3】:
        perl -F'/\t/' -anle 'BEGIN{$f=1}if($f==1){$H{$F[2]}=$_;$f++ if eof}else{$l=$H{$F[0]};print join("\t",$l,@F[1..$#F]) if defined$l}' f1.txt f2.txt
        

        或更短

        perl -F'/\t/' -anle'$f?($l=$H{$F[0]})&&print(join"\t",$l,@F[1..$#F]):($H{$F[2]}=$_);eof&&$f++' f1.txt f2.txt
        

        【讨论】:

          【解决方案4】:

          一种使用awk的方式:

          awk 'BEGIN { FS=OFS="\t" } FNR==NR { array[$1]=$2 OFS $3; next } { if ($3 in array) print $0, array[$3] }' file2.txt file1.txt
          

          结果:

          A1  123 AA  1asrf   5
          B1  123 BB  124sdf  4
          D1  12  DD1 124f2   2
          

          【讨论】:

          • @Chronicles:我已经对此进行了测试。这对我来说可以。您的文件都是制表符分隔的吗?您收到错误消息吗?
          • 两个文件都是制表符分隔的......但是当我执行时我也没有得到任何错误和输出......
          • @Chronicles:这很奇怪。你用的是什么版本的awk
          【解决方案5】:

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

          sed 's|\(\S*\)\(.*\)|/\\s\1$/s/$/\2/p|' file2 | sed -nf - file1
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-02
            • 1970-01-01
            • 1970-01-01
            • 2021-04-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多