csplit을 사용하여 구분 기호를 제거할 수 있습니까? 예:
$ cat in
abc
---
def
---
ghi
$ csplit -q in /-/ '{*}'
$ ls x*
xx00 xx01 xx02
$ head xx*
==> xx00 <==
abc
==> xx01 <==
---
def
==> xx02 <==
---
ghi
분할하여 구분 기호를 유지하는 기능 대신 구분 기호를 분할하고 제거하도록 요청할 수 있습니까?
즉, 원하는 출력은 다음과 같습니다.
$ sed -i '/-/d' xx*
$ head xx*
==> xx00 <==
abc
==> xx01 <==
def
==> xx02 <==
ghi
위의 작업은 두 단계로 수행할 수 있지만 한 단계로 수행할 수 있습니까?
csplit을 사용하여 수행할 수 없는 경우 위의 두 호출(csplit + sed)보다 더 짧은 1단계 방법이 있습니까? 합리적으로 읽을 수 있는 한 사용된 도구는 우선순위가 없습니다.
답변1
당신이 사용하는 것 같기 때문에 gnu csplit
:
csplit --suppress-matched infile /PATTERN/ '{*}'
즉, --suppress-matched
일치하는 줄을 억제 하는 데 사용됩니다 PATTERN
.
csplit
귀하의 의견에 따르면 이 옵션은 최신 버전 ( coreutils
≥8.22) 에서만 사용할 수 있습니다.
답변2
정규식 일치 대신 문자열 일치를 사용할 수 있는 경우
awk 'BEGIN {RS="---\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in
GNU awk 사용(최소 v4.0.1에서는)예RS
예를 들어 정규식을 사용할 수 있습니다 .
gawk 'BEGIN {RS="-+\n"; ORS=""} {print > sprintf("xx%02d", NR)}' in
답변3
perl -ne 'BEGIN { $fnum=0; open $fh, ">", sprintf "xx%02d", $fnum++ } if (m/-/) { open $fh, ">", sprintf "xx%02d", $fnum++ } else { print $fh $_ }' inputfileorfileshere
또는 유사하게 또는 다른 방법으로 해당 줄과 일치하는 새 파일을 다시 엽니다 awk
.