awkの

2017-05-14 22 views
1

私は、彼らが$2値がFusionであり、同じ$4値が各行にある持っている場合tab-delimitedファイル内の重複行を削除するawkを使用しようとしています。下の例では、1行目と2行目は同じ$2の値を持ち、$4の値も同じなので、重複する行2は削除されます。 3行目と4行目もこのロジックに従います。行の量は可変ですが、形式は同じです。 5行目と6行目にはにFusionが含まれていないので、それらはスキップされ、出力に出力されます。ありがとうございました :)。awkの

ファイル

chr12:12006495-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868 
chr15:88483984-chr12:12006495 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868 
chr12:12022903-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833 
chr15:88483984-chr12:12022903 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833 
chr10  SNV  .... 
chr15  SNV  .... 

awkの

awk -F'\t' '{if($2 in a)a[$2]=$2=="Fusion"?$0:a[$4];else a[$4]=$0}END{for(i in a)print a[i]}' file 

所望の出力

chr12:12006495-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E4N15 1868 
chr12:12022903-chr15:88483984 Fusion Gain-of-Function ETV6NTRK3-E5N15 414833 
chr10  SNV  .... 
chr15  SNV  .... 

答えて

3
awk -F'\t' '!($2 == "Fusion" && seen[$4]++)' file 
  • $2 == "Fusion" && seen[$4]++その2ndフィールドFusionに等しく、その4番目のフィールドの前に少なくとも一回見られたマッチライン。

    • seen[$4]++は増分要求に応じてエントリを追加し、各値の出現回数を記録することにより、フィールド値の連想配列を構築し、共通のAWKイディオムです。 ポスト -decrement(...++)は、後続のすべてのオカレンスがを意味するのに対し、最初時間seen[$4]++に与えられた値に遭遇に、偽(概念的な)に評価されることを保証します。 2番目のフィールドは、4番目のフィールドの値がされているない等しいFusion
    • 又はを行い

    • !(...)(概念)を評価する論理を否定場合のみ最初に時に見られます。

  • 全体!(...)式はawkの用語でパターンあり、への関連アクション{ ... }ブロック)のデフォルト値を有していないパターンが手
    入力レコードを印刷する(アクション{ print }暗黙のうちに)。

帽子のEd Mortonへの彼の助け。

1

これは私のために働くように見えた:

awk -F'\t' '{if($2 == "FUSION")a[$4] = $0; else b[$0]=$0;}END{for(k in a)print a[k];for(l in b)print b[l];}' file 

唯一の問題は、すべての$2 == "FUSION"例が最初に来るように、それは物事を並べ替えることです。

+0

ご協力いただきありがとうございます。 – Chris