2016-08-31 8 views
0

で別で印刷こんにちは私は怒鳴るの例でこれを実行する必要があります。チェック重複列とbashの

入力ファイル:

chr17 41246351 41246352 NM_007294_Exon_10 
chr17 41246351 41246352 NM_007297_Exon_9 
chr17 41246351 41246352 NM_007300_Exon_10 
chr17 41246351 41246352 NR_027676_Exon_10 
chr17 41246352 41246353 NM_007294_Exon_10 
chr17 41246352 41246353 NM_007297_Exon_9 
chr17 41246352 41246353 NM_007300_Exon_10 

このような出力を取得:

chr17 41246351 41246352 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10,NR_027676_Exon_10 
chr17 41246352 41246353 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10 

を私がしましたuniqsortを使用しようとしましたが、成功しませんでした。何か助けてくれてありがとう。

答えて

2

あなたはこのawk使用することができます:カンマ区切りとして、あなたが最後の列をしたい場合は

awk '{i=$1 FS $2 FS $3} {a[i]=!a[i]?$4:a[i] FS $4} END {for (l in a) {print l,a[l]}}' file 

を、

awk '{i=$1 FS $2 FS $3} {a[i]=!a[i]?$4:a[i] "," $4} END {for (l in a) {print l,a[l]}}' file 
+0

ワウこれは非常に良い解決策です。それはそれが私に完全にうまく動作するように見えます。どうもありがとうございます! – Geroge

0

はAWKを使用しよう:

awk '!seen[$2]++' testfile 

・ホープ、このことができます!

+0

完全に質問を読んでください – Sundeep

+0

@Sploatありがとうございますが、これは通常awkのユニークな解決策です、私が必要なものを印刷しません。 – Geroge

+0

ああ、申し訳ありませんが、あなたは正しいです。最後の部分を見ていない。 – Syerad

1
$ perl -ne '($k,$v)=/^(.*\s)(\S+)$/; $h{$k} .= "$v,"; 
      END{print "$_$h{$_}\n" foreach keys %h }' ip.txt 
chr17 41246351 41246352 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10,NR_027676_Exon_10, 
chr17 41246352 41246353 NM_007294_Exon_10,NM_007297_Exon_9,NM_007300_Exon_10, 

これは... sed 's/,$//'

を使用して削除したり、必要に応じてカンマを追加することが条件?:(awkの溶液中で@satで使用されるロジックに類似)を使用することができるが、末尾,を残し、必要ありません。後処理を後処理するための後処理

$ perl -ne '($k,$v)=/^(.*\s)(\S+)$/; $h{$k} .= $h{$k}?",$v":"$v"; 
      END{print "$_$h{$_}\n" foreach keys %h }' ip.txt 
+0

perlソリューションをありがとうございました。私はperlでの経験がないので、このレッスンをとてもうれしく思っています。 – Geroge

関連する問題