열 값을 기준으로 탭으로 구분된 파일 분할

열 값을 기준으로 탭으로 구분된 파일 분할

두 번째 열의 값을 기준으로 여러 열로 분할하려는 대용량 파일이 있습니다. "전환 지점"에 데이터가 포함된 일련의 출력 파일을 원합니다. 스위칭 포인트가 불규칙해서 라인 번호로 나눌 수 없습니다. 아래 데이터는 약 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

일치하는 선을 다음에 표시합니다.각 파일에 대해 수표를 다음으로 이동하십시오.뒤쪽에여기에 표시된 대로 이전 루틴 대신 루틴을 인쇄합니다.

관련 정보