도구 출력에서 .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