문제는 원본 파일이 0~45줄을 포함할 수 있지만 항상 3으로 나눌 수 있다는 것입니다.
명령 을 시도했지만 split -l
파일이 너무 많이 생성되었습니다. 누군가가 나에게 올바른 방향을 알려줄 수 있기를 바라지만, split
그렇지 않은 것 같습니다.
15줄이 포함된 원본 파일의 예:
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
...
출력 예:
파일 1
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
파일-2
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
파일-3
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
파일 4
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
답변1
앗해결책:
awk 'BEGIN{ f=1 }!(NR%3){ n=NR+1 }NR==n{ f++ }
{ print > "STATUS_FILE-"f".txt" }!(NR%12){ f=0 }' file
BEGIN{ f=1 }
- 초기 파일 인덱스 번호 설정!(NR%3)
-true
세 번째 행마다 계산f++
- 세 번째 줄마다 파일 인덱스 번호를 증가시킵니다.!(NR%12){ f=0 }
- 12번째 줄마다 파일 인덱스 번호 재설정(4부)print > "STATUS_FILE-"f".txt"
- 원하는 파일 인덱스 번호로 파일에 줄을 인쇄합니다.
결과 보기:
$ head STATUS_FILE*
==> STATUS_FILE-1.txt <==
lineAA|data|Format via FG|398
lineAB|data|Format via FG|398
lineAC|data|Format via FG|398
line_FA|data|Format via FG|398
line_FB|data|Format via FG|398
line_FC|data|Format via FG|398
==> STATUS_FILE-2.txt <==
line_XA|data|Format via FG|398
line_XB|data|Format via FG|398
line_XC|data|Format via FG|398
==> STATUS_FILE-3.txt <==
line_ZA|data|Format via FG|398
line_ZB|data|Format via FG|398
line_ZC|data|Format via FG|398
==> STATUS_FILE-4.txt <==
line_XX|data|Format via FG|398
line_XY|data|Format via FG|398
line_XZ|data|Format via FG|398
"독립"을 창조하다앗스크립트:
split_on_4x3.awk
스크립트 내용:
#!/bin/awk -f
BEGIN { f=1 }
!(NR%3) { n=NR+1 }
NR==n { f++ }
{ print > "STATUS_FILE-"f".txt" }
!(NR%12) { f=0 }
용법:
awk -f split_on_4x3.awk inputfile
답변2
그러면 한 번에 세 줄씩 그룹으로 파일을 반복하여 각각 file0.txt
, file1.txt
, file2.txt
, 을 작성합니다 file3.txt
. 여러 줄로 나누었는데, 한 줄만 연결하면 하나로 합칠 수 있습니다.
awk '
BEGIN { f=-1 }
!( (NR-1) % 3) { f = (f+1) % 4 }
{ print > "file" f ".txt" }
' source.txt
이 awk
프로그램에는 세 가지 명령이 있습니다. 이 BEGIN {}
블록은 프로그램이 시작될 때 첫 번째 줄을 읽기 전에 실행됩니다. 각 입력 줄은 나머지 두 명령어에 적용됩니다. 첫 번째는 3개 그룹으로 행을 계산하고( NR
현재 행 번호 저장) 각 그룹의 끝에서 파일 번호를 증가시킵니다. f
파일 번호가 네 번째 항목에 도달하면 첫 번째 항목으로 다시 재설정됩니다. (이 계산 및 재설정 방법은 모듈로 연산자를 사용합니다. %
)
답변3
split
매뉴얼 페이지에서 다음을 사용하려는 것 같습니다 .
NAME split -- split a file into pieces SYNOPSIS split [-a suffix_length] [-b byte_count[k|m]] [-l line_count] [-p pattern] [file [name]] DESCRIPTION The split utility reads the given file and breaks it up into files of 1000 lines each. If file is a single dash (`-') or absent, split reads from the standard input. The options are as follows: [...] -l line_count Create smaller files n lines in length.
split bigfile -l3
각각 세 줄을 포함하는 더 작은 파일 로 분할됩니다 bigfile
.