我有一个大文件,我试图根据第二列的值将其分成几列。我想要一系列包含“切换点”处的数据的输出文件。切换点是不规则的,所以我无法按行号进行分割。下面的数据给出了约 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
使匹配的行出现在结尾对于每个文件,只需将检查移至后打印例程,而不是在它之前,如此处所示。