2017-08-18 2 views
1

約200,000列と約5000行の大きなファイルがあります。 ファイルの短い例を示します。列1と5が重複しています。ファイルbashツールから列を削除する

Abf Bgj Csd Daa Abf Efg ... 
0 1 2 1 0 1.1 
2 0.1 1.2 0.3 2 1  
... 

これは私が必要とする結果の例です。元のファイルの列5が削除されました。

Abf Bgj Csd Daa Efg ... 
0 1 2 1 1.1  
2 0.1 1.2 0.3 1  
... 

いくつかの列は複数回複製されます。 bashツールを使用してデータから重複を削除する必要があります(最初のインスタンスを維持する)。 注文を保存する必要があるため、データを並べ替えることができません。

+0

あなたの質問をフォーマットし、希望の出力を表示 – RomanPerekhrest

+0

各列の値を比較する必要がありますか、列見出しだけで十分でしょうか?例えば、canファイルには、同じ 'Abf'ヘッダを持つ異なるカラムが含まれていますか?つまり、1)ファイルをトラバースし、同じヘッダーを持つすべての列を削除し、2)ファイルをトラバースし、同じヘッダーと値を持つすべての同じ列を削除します。 – MiniMax

+0

私は列ヘッダーを比較するだけです。 – gwarr

答えて

5
$ cat tst.awk 
NR==1 { 
    for (i=1;i<=NF;i++) { 
     if (!seen[$i]++) { 
      f[++nf]=i 
     } 
    } 
} 
{ 
    for (i=1;i<=nf;i++) { 
     printf "%s%s", $(f[i]), (i<nf?OFS:ORS) 
    } 
} 

$ awk -f tst.awk file | column -t 
Abf Bgj Csd Daa Efg 
0 1 2 1 1.1 
2 0.1 1.2 0.3 1 
+0

これはうまく動作します。このコードブロックがどのように機能するか説明してください。 – gwarr

+0

あなたはそれのどの部分を理解していませんか? –

0

あなたはdatamashプログラムを使用することができます。

datamash -W transpose < input.txt | datamash rmdup 1 | datamash transpose 

GNU datamashは、入力テキストデータ ファイルに関する基本的な 数値、テキストおよび統計的な操作を実行するコマンドラインプログラムです。

説明:

  1. datamash -W transpose < input.txt
    • 移調 - スワップ行と列を。行は現在列であり、列は行です。
    • -W - フィールドの区切り文字に空白(1つ以上の空白および/またはタブ)を使用します。
  2. datamash rmdup 1 - 最初の列の値によって重複行を削除
  3. datamash transpose - スワップ行及びバック列

入力

Abf Bgj Csd Daa Abf Efg 
0 1 2 1 0 1.1 
2 0.1 1.2 0.3 2 1 

出力

Abf Bgj Csd Daa Efg 
0 1 2 1 1.1 
2 0.1 1.2 0.3 1 
関連する問題