根据列值拆分制表符分隔的文件

根据列值拆分制表符分隔的文件

我有一个大文件,我试图根据第二列的值将其分成几列。我想要一系列包含“切换点”处的数据的输出文件。切换点是不规则的,所以我无法按行号进行分割。下面的数据给出了约 50 万行的一小部分摘录

...
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

使匹配的行出现在结尾对于每个文件,只需将检查移至打印例程,而不是在它之前,如此处所示。

相关内容