2016-02-26 29 views
-1

我正在尋找一種方法來合併基於前2行的一些文件。但我不想排除uniq值,我希望他們留下來,以便我可以創建一個最終的獨特文件。如何在保持不匹配的值時合併兩個文件?

我嘗試使用這個命令:

join <(sort 1) <(sort 2) | tac | awk '{print $1,$3,$4,$5,$2}' | column -t 

但它合併,只輸出匹配的東西。

例如,文件1的這樣的數據:

mm1 36307733 36324029 1.45947622984395 
mm1 36530188 36547201 -1.05469327277336 
mm1 37874801 37890411 1.1818111527155 
mm1 39551296 39577405 1.03024743095568 
mm1 40465552 40500854 1.69797988062545 

文件2:

mm1 17601901 17630939 -1.02477154457324 
mm1 21511933 21513056 -1.01776484266642 
mm1 23995939 24005656 -1.29725218483742 
mm1 24612407 24612700 -1.5481572503361 
mm1 24612775 24613119 -1.69044737891815 

文件3:

mm1 21218575 21230167 -1.0792454238353 
mm1 23995939 24005656 -1.38350179201041 
mm1 24612407 24612700 -1.99368917819954 
mm1 24612775 24613119 -1.27503764730879 
mm1 36140027 36244720 1.15136681818451 

在未包含在輸出文件的行其他文件應標爲0

output.file

      File 1 File 2 File 3 
mm1 36307733 36324029 1.45947622984395 0 0 
mm1 6530188  36547201 -1.05469327277336 0 0 
mm1 37874801 37890411 1.1818111527155  0 0 
mm1 39551296 39577405 1.03024743095568 0 0 
mm1 40465552 40500854 1.69797988062545 0 0 
mm1 17601901 17630939 0 -1.02477154457324 0 
mm1 21511933 21513056 0 -1.01776484266642 0 
mm1 23995939 24005656 -1.29725218483742 -1.38350179201041 
mm1 24612407 24612700 -1.5481572503361 -1.99368917819954 
mm1 24612775 24613119 0 0 -1.27503764730879 
mm1 36140027 36244720 0 0 1.15136681818451 
+1

請顯示你已經試過,謝謝。 – jkdba

+0

我編輯了我的帖子。 –

+0

所以你發佈了一個問題,並接受了你得到的第一個答案,即使這個答案使用了一大堆GNU特有的工具和管道,特別是「這實際上是awk的一個工作。」。好的祝你好運! –

回答

1

awk來救援!

這裏是不被固定到三個文件

$ awk 'FNR==1{c++} {k=$1 FS $2 FS $3; keys[k]; a[k,c]=$4} 
       END{for(key in keys) 
         {printf "%s", key FS; 
         for(i=1;i<=c;i++) 
          printf "%s", (a[key,i]?a[key,i]:0) FS; 
         print ""}}' file{1,2,3} | 
    sort | column -t 

mm1 17601901 17630939 0     -1.02477154457324 0 
mm1 21218575 21230167 0     0     -1.0792454238353 
mm1 21511933 21513056 0     -1.01776484266642 0 
mm1 23995939 24005656 0     -1.29725218483742 -1.38350179201041 
mm1 24612407 24612700 0     -1.5481572503361 -1.99368917819954 
mm1 24612775 24613119 0     -1.69044737891815 -1.27503764730879 
mm1 36140027 36244720 0     0     1.15136681818451 
mm1 36307733 36324029 1.45947622984395 0     0 
mm1 36530188 36547201 -1.05469327277336 0     0 
mm1 37874801 37890411 1.1818111527155 0     0 
mm1 39551296 39577405 1.03024743095568 0     0 
mm1 40465552 40500854 1.69797988062545 0     0 

不需要陣列或陣列(真實的多維數組)的AWK溶液。

+0

令人驚歎!我喜歡你的其他圖片karakfa!你真的是一個awk大師。感謝您的解決方案。 –

+0

等到真正的高手籌碼進場。 – karakfa

2

隨着GNU的bash,切,GNU的grep,GNU排序和列:

#!/bin/bash 

cut -d " " -f 1-3 file1 file2 file3 | sort -u | while read -r line; do 
    echo -n "$line: " 
    (
    grep -Po "$line"'\K.*' file1 || echo " 0 " 
    grep -Po "$line"'\K.*' file2 || echo " 0 " 
    grep -Po "$line"'\K.*' file3 || echo " 0 " 
) | tr -d '\n' 
    echo 
done | column -t 

輸出:

 
mm1 17601901 17630939 0     -1.02477154457324 0 
mm1 21218575 21230167 0     0     -1.0792454238353 
mm1 21511933 21513056 0     -1.01776484266642 0 
mm1 23995939 24005656 0     -1.29725218483742 -1.38350179201041 
mm1 24612407 24612700 0     -1.5481572503361 -1.99368917819954 
mm1 24612775 24613119 0     -1.69044737891815 -1.27503764730879 
mm1 36140027 36244720 0     0     1.15136681818451 
mm1 36307733 36324029 1.45947622984395 0     0 
mm1 36530188 36547201 -1.05469327277336 0     0 
mm1 37874801 37890411 1.1818111527155 0     0 
mm1 39551296 39577405 1.03024743095568 0     0 
mm1 40465552 40500854 1.69797988062545 0     0 

PS:它實際上是awk的工作。

+0

它工作非常welll。感謝您的幫助! –

相關問題