【问题标题】:Join Two Files Based on TWO Columns in Common基于共同的两列连接两个文件
【发布时间】:2019-01-27 04:32:17
【问题描述】:

我有两个文件正在尝试根据第一列和第二列加入/合并。下面是我想要的输出。我想强调一件事,我想合并这两个文件,而不仅仅是交集。任何帮助将不胜感激!

$ cat file1
2L      5753   33158
2L      8813   33158
2L      7885   33159
2L      1279   33159
2L      5095   33158
$
$ cat file2
2L      8813    0.6    1.2
2L      5762    0.4    0.5
2L      1279    0.5    0.9
$

Desired Output:
2L      5753                33158
2L      8813    0.6    1.2  33158
2L      7885                33159
2L      1279    0.5    0.9  33159
2L      5095                33158
2L      5762    0.4    0.5

我发现了一个类似的帖子,但它似乎需要一些调整才能满足我的想法。网址是: Similar Stackoverflow link

【问题讨论】:

  • 文件中的分隔符是什么?多个空格还是一个制表符?
  • @Cyrus 谢谢!列之间有多个空格!
  • 你尝试过什么调整?

标签: linux bash awk merge


【解决方案1】:

与gawk:

$ gawk -F$'\t' -v OFS=$'\t' 'FNR==NR{l[$1,$2]=$0; next}  
                       l[$1,$2]{print l[$1,$2],$3; delete l[$1,$2]; next} 
                        {print $1,$2,OFS,$3}
                        END{for (e in l) if(l[e]) print l[e]}' f2 f1
2L  5753            33158
2L  8813    0.6 1.2 33158
2L  7885            33159
2L  1279    0.5 0.9 33159
2L  5095            33158
2L  5762    0.4 0.5

这假定\t 分隔字段。

【讨论】:

    【解决方案2】:

    以下 bash 脚本从 file1 中读取每一行,从 file2(的副本)中提取相应的行,合并这两行,并将结果打印到 stdout。最后,file2(剩下的)被打印出来了。

    temp=$(mktemp)
    cp file2 $temp
    while read col1 col2 arg3; do
      line=$(sed -r -i -e "/^$col1\ +$col2/ {w /dev/stdout" -e "d}" $temp)
      arg1=$(awk '{print $3}' <<< $line)
      arg1=${arg1:-   }
      arg2=$(awk '{print $4}' <<< $line)
      arg2=${arg2:-   }
      echo -e "$col1\t$col2\t$arg1    $arg2\t$arg3"
    done < file1
    cat $temp
    rm $temp
    

    sed 命令的想法取自 dhakimian 对 Gilles 在Printing and deleting the first line of a file using sed 上的回答的扩展。

    【讨论】:

      猜你喜欢
      • 2013-09-29
      • 2012-10-11
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多