2011-07-26 7 views
2

私は、このようなファイル(3列とn行の数を)持っている 削除冗長データ

chr8 101999980 102031975 
chr8 101999980 102033533 
chr8 101999980 102033533 
chr8 101999980 102032736 
chr8 101999980 102034799 
chr8 101999980 102034799 
chr8 101999980 102034397 
chr8 101999980 102032736 

私は冗長な行を削除すると、これらの正確な繰り返しのデータはどこにでも存在する可能性があり、このデータから、このデータセットではbashスクリプトを使用しています。

答えて

1
sort yourfile | uniq > outputfile 

ご注文いただいた場合は問題ではありません。

これは隣接する同じ行で動作します。そのため、並べ替えが必要です。あなたのファイルでは、重複が互いに隣り合っているのでソートする必要はありません。それが標準的なケースでない場合は、まずファイルをソートする必要があります。

$ uniq yourfile | wc -l 
6 
$ sort yourfile | uniq | wc -l 
6 

ソートの有無にかかわらず、6行が返されますが、デフォルトではありません。

+0

確かに、私はuniqはいずれのカラムでも動作し、3つのカラムすべてにマッチしないと思います。 – Angelo

+0

これは隣接する同じ行で動作するため、ソートが必要です。あなたのファイルでは、重複が互いに隣り合っているのでソートする必要はありません。それが標準的なケースではない場合は、まずファイルをソートする必要があります。 – Jacob

+0

受け入れありがとうございます。 – Angelo

3

あなたはsortuniqを通じてパイプファイルをすることができます

$ sort yourFile | uniq > newFile 
+0

であるuが必ず、私はuniqは、マッチングにいずれかのカラム上で動作していないだろうと思いますすべての3つの列。 – Angelo

+0

@Angelo、nope、 'uniq'は行全体をチェックします。 1つの列だけをフィルタリングするには、パイプラインに 'cut'のようなものを導入する必要があります。 –

4

順序を維持することが重要である場合:

awk '!c[$0]++' filename 

これは以下のように読み取ることができる。

  • ++(、配列のキー(c[$0])として
  • ポストインクリメントを各ラインを押します)そのような行の数を保持する値、および
  • は、行が以前に見たことがない場合にのみ、デフォルトアクションを実行します(!
    • n++戻り0、またはfalse、nが設定されていない場合
    • デフォルトのアクションは{print}
+0

これはかなりクールです。ドキュメントの関連セクションへのリンクもすばらしいでしょう:) –

関連する問題