2016-04-27 11 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列目の値でインデックスを作成して重複行を削除する必要があります。 $ 4にコンマで区切られた文字列の数を追加して$ 5を追加します。以下に示すサンプル出力:

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

同一配列の順序はランダムですか?第1列と第2列が同じであると述べました。 3番目の列が異なるとどうなりますか。どちらを使うべきですか? –

+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 

出力:

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 

とget:

タブ区切りの入力については
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

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

大歓迎です!ドイツからのご挨拶! –

関連する問題