列値に基づいてタブ区切りのファイルを分割する

列値に基づいてタブ区切りのファイルを分割する

2番目の列の値に基づいて複数の列に分割したい大容量ファイルがあります。 「変換ポイント」にデータを含む一連の出力ファイルが必要です。スイッチングポイントが不規則でライン番号に分割できません。以下のデータは、約500,000行の一部を抜粋したものです。

...
605.144302472158    -5.18798828125E-07  0.98388671875
606.144302469633    -5.18798828125E-07  0.98419189453125
606.644327468370    -0.000150299072265625   0.93475341796875
... (~900-1800 rows)
1505.64432519861    -0.000150115966796875   0.4075927734375
1506.14432519735    -0.000150177001953125   0.40753173828125
1507.14435219483    -3.60107421875006E-07   0.41827392578125
1508.14435219230    -3.47900390625003E-07   0.420135498046875
... 

出力は次のようになります。ファイル1

...
    605.144302472158    -5.18798828125E-07  0.98388671875
    606.144302469633    -5.18798828125E-07  0.98419189453125

ファイル2

606.644327468370    -0.000150299072265625   0.93475341796875
... (900-1800 rows)
1505.64432519861    -0.000150115966796875   0.4075927734375
1506.14432519735    -0.000150177001953125   0.40753173828125

ファイル3

1507.14435219483    -3.60107421875006E-07   0.41827392578125
1508.14435219230    -3.47900390625003E-07   0.420135498046875
... 

使用 awk '$2>-0.000001 {print}' input.txt

そして awk '$2<-0.000001 {print}' input.txt

正しいデータを選択できますが、$ 2> -0.000001が「true」から「false」に変わるたびに新しいファイルを生成する方法がわかりません。

awk '{print > (++a[$2>-0.000001] ".txt")}' input.txt 出力をファイルに印刷を使用すると、さらに一歩近づきましたが、条件を満たす各行ごとに別々のファイルを印刷します。

一種のwhileループが必要なようですが、どのように見えるのかわかりません。

ベストアンサー1

特定の条件が満たされるたびに出力を新しいファイルに切り替えるには、出力ファイルの名前を格納する変数を使用し、そのデータに一致する項目が表示されるたびにそれを変更します。

$ cat input
17
1
4
13
9
10
7
5
18
19
3
6
16
8
12
15
14
2
11
20
$ awk 'BEGIN { outfilenum=1; outfile="file"outfilenum} $1 > 10 { outfilenum++; outfile = "file"outfilenum} {print >> outfile}' input
$ paste file*
11  20  17  13  18  19  16  12  15  14
        1   9       3   8           2
        4   10      6
            7
            5

一致する線を次に表示します。終わり各ファイルについて、小切手を次に移動します。後ろにここに示すように、前のルーチンの代わりにルーチンを印刷します。

おすすめ記事