次のように、多くの列と行を含む大容量ファイルがあります。
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