特定のヘッダー名を持つ行と「1」を含む列をフィルタリングします。

特定のヘッダー名を持つ行と「1」を含む列をフィルタリングします。

次のように、多くの列と行を含む大容量ファイルがあります。

A  B  C  D  E  F1  F2  F3  F4  F5
a1 b1 c1 d1 e1 0   0   1   0   1
a2 b2 c2 d2 e2 1   0   0   1   1
a3 b3 c3 d3 e3 1   1   0   0   1
....

列A、B、C、D、およびEにはいくつかの情報が含まれており、列F1-5は一部のIDを表します。 0または1は、このIDのAE情報が存在しない/存在することを示します。

各IDのファイルを作成したいと思い、各ファイルにはIDが持つABCDE情報が含まれています。たとえば、F5の最初の3行には1が3つあります。

F5.txt:

A  B  C  D  E 
a1 b1 c1 d1 e1 
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

F1の最初の3行には1つが2つあるため

F1.txt:

A  B  C  D  E  
a2 b2 c2 d2 e2 
a3 b3 c3 d3 e3

awkを使用してこのファイルをフィルタリングし、ID名(F1、F2 ...)で新しいファイルを作成するにはどうすればよいですか?

ベストアンサー1

AWK解決策:

awk 'NR==1{ split($0,h); columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5]); next }
     { for (i=6;i<=NF;i++) 
           if ($i) { 
               if (!a[h[i]]++) print columns > h[i]".txt"; 
               print $1,$2,$3,$4,$5 > h[i]".txt" 
           } 
      }'  file
  • split($0,h)- レコード1を配列に分割hして取得します。ヘッダーリスト

  • columns=sprintf("%s %s %s %s %s",h[1],h[2],h[3],h[4],h[5])- 公開列文字列の構成A B C D E

  • if($i)- 現在のフィールド(フィールド6から始まる)、つまり""(空の文字列)ではないか、0- 追加処理の準備ができています。

  • h[i]- 現在を指す。ファイル名F1すなわち(またはあなたが書いたように:一部のIDを示します。)

  • if (!a[h[i]]++) print columns > h[i]".txt"- その名前のファイルをh[i]初めて作成する場合 - ヘッダー/列行を印刷します(最初の行として)。


結果を見る:

$ head F*.txt
==> F1.txt <==
A B C D E
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

==> F2.txt <==
A B C D E
a3 b3 c3 d3 e3

==> F3.txt <==
A B C D E
a1 b1 c1 d1 e1

==> F4.txt <==
A B C D E
a2 b2 c2 d2 e2

==> F5.txt <==
A B C D E
a1 b1 c1 d1 e1
a2 b2 c2 d2 e2
a3 b3 c3 d3 e3

おすすめ記事