쉘 스크립트를 사용하여 행 텍스트를 기준으로 .txt 파일을 3개의 파일로 분할

쉘 스크립트를 사용하여 행 텍스트를 기준으로 .txt 파일을 3개의 파일로 분할

도구 출력에서 ​​.txt 파일을 가져와야 하는 요구 사항이 있는데 이를 세 개로 분할하고 싶습니다.

파일의 텍스트 예:

First line
Second line
23456
45677
45678

Third line
90909
90678

Last line
Z567Z
6787T

예상 출력:

-> 파일 1.txt

23456
45677
45678

-> 파일 2.txt

90909
90678

-> 파일 3.txt

Z567Z
5677T

기본적으로 파일에는 사용하려는 5자리 숫자/영숫자 값이 있으며, 그 사이의 텍스트는 파일을 여러 파일로 분할하기 위한 식별자로 사용됩니다.

awk이 작업을 수행하려면 or 명령을 사용하려고 합니다 sed.

답변1

이것이 필요한 것이 아닌 경우:

$ awk '
    /^[[:alnum:]]{5}$/ {
        if ( !inBlock++ ) {
            close(out)
            out = "file" (++cnt) ".txt"
        }
        print > out
        next
    }
    { inBlock = 0 }
' file

$ head file?.txt
==> file1.txt <==
23456
45677
45678

==> file2.txt <==
90909
90678

==> file3.txt <==
Z567Z
6787T

그런 다음 질문을 편집하여 보다 명확한 요구 사항과 보다 대표적인 입력/출력 예제를 제공하십시오.

답변2

이것은 추악한 라인입니다.

grep -v '[:alpha:]' test.txt | sed "s/^$/==/g" | split -p "=="

참고: 이렇게 하면 "==" 패턴을 기반으로 3개 이상의 파일(xa*)이 생성됩니다.

추가로 for 루프를 사용하여 "==" (sed 's/=//g' xa* | grep -v "^$")(있는 경우)를 제거할 수 있습니다.

답변3

GNU 도구 상자에서 grep+csplit를 사용할 수 있습니다.

grep -v '\W' < your_file |
csplit --suppress-matched \
  -szn1 -f file -b '%d.txt' \
  - '/^$/' '{*}'

awk는 단락 모드에 있으며, 여기서 레코드는 최소한 하나의 빈 줄로 구분됩니다.

awk -v RS= '
match($0,/\n[[:alnum:]]+(\n|$)/) {
  out = "file" NR ".txt"
  print substr($0,1+RSTART) > out
  close(out)
}
' your_file

GNU sed를 사용하여 먼저 입력 데이터에서 sed 코드를 생성한 다음 이를 조작하여 필요한 출력 파일을 생성합니다.

sed -En '
  1{x;s/.*/123/;x;}
  /^\w+$/{=;$z;}
  /^$/{
    G
    s/^(.)(.)(.*)/wfile\2.txt\1\3/
    P;s/.*\n//;h
  }
' your_file | sed -Ee '
  :a;N;/\n[0-9]+$/ba
  s/\n(.*\n)?([0-9])/,\2/
  s/\n//
' - | sed -nf - your_file

출력 파일: csplit의 경우 파일 번호 지정은 0부터 시작됩니다.

==> file1.txt <==
23456
45677
45678

==> file2.txt <==
90909
90678

==> file3.txt <==
Z567Z
6787T

관련 정보