2016-04-27 33 views
1

有製表符分隔的文件,如下圖所示:我如何刪除重複的行,並創建指數AWK

CNV_chr1_12623251_12632176 8925 3 RR123 XX 
CNV_chr1_13398757_13402091 3334 4 RR123 YY 
CNV_chr1_13398757_13402091 3334 4 RR224 YY 
CNV_chr1_14001365_14004064 2699 1 RR123 YX 
CNV_chr1_14001365_14004064 2699 1 RR224 YX 

列了$ 1,$ 2歲的相同。在這種情況下,我需要通過索引第4列中的值來刪除重複行。並添加額外的5美元,並在$ 4中以英文逗號分隔。示例輸出如下所示:

CNV_chr1_12623251_12632176 8925 3 RR123 1 XX 
CNV_chr1_13398757_13402091 3334 4 RR123,RR124 2 YY  
CNV_chr1_14001365_14004064 2699 1 RR123,RR224 2 YX 

任何有效的操作都會有幫助。

+0

相同序列的順序是隨機的嗎?你說第一和第二列保持相同。當第三欄不同時會發生什麼。哪一個應該使用? –

+0

搜索鍵是$ 1和$ 2。這與其他專欄的內容無關。下面的解決方案工作,但需要稍微修復 – chas

回答

1

試試這個:

awk '($1 in ar){ar[$1]=ar[$1]; br[$1]=br[$1]","$4; next;} 
    {br[$1]=$4; $4="REPLACE_ME"; ar[$1]=$0} 
    END{for(key in ar){c=split(br[key],s,",") 
         gsub("REPLACE_ME", br[key] FS c, ar[key]) 
         print ar[key]}}' test.txt 

輸出:

CNV_chr1_14001365_14004064 2699 1 RR123,RR224 2 YX 
CNV_chr1_13398757_13402091 3334 4 RR123,RR224 2 YY 
CNV_chr1_12623251_12632176 8925 3 RR123 1 XX 

對於製表符分隔輸入只需添加-F"\t"awk

awk -F"\t" '($1 in ar){ar[$1]=ar[$1]; br[$1]=br[$1]","$4; next;} 
      {br[$1]=$4; $4="REPLACE_ME"; ar[$1]=$0} 
      END{for(key in ar){c=split(br[key],s,",") 
         gsub("REPLACE_ME", br[key] FS c, ar[key]) 
         print ar[key]}}' test.txt 

,並得到:

CNV_chr1_14001365_14004064 2699 1 RR123,RR224 2 YX 
CNV_chr1_13398757_13402091 3334 4 RR123,RR224 2 YY 
CNV_chr1_12623251_12632176 8925 3 RR123 1 XX 
+0

我保持輸入文件易於理解。現在代碼添加到最後一列。我已經做了一個編輯,其中包含了其他列。對此有何解決方法? – chas

+0

太棒了!並感謝 – chas

+0

不客氣!來自德國的問候! –