4개 파일 중 하나를 한 번에 3줄로 분할할 수 있나요?

4개 파일 중 하나를 한 번에 3줄로 분할할 수 있나요?

문제는 원본 파일이 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.

관련 정보