단락에 "7-04/PNLP-000001" 형식의 코드가 포함될 때마다 텍스트 파일을 별도의 파일로 분할하도록 gawk를 시도하고 있습니다. 예를 들어 원본 텍스트 파일에 다음 내용이 포함되어 있는 경우:
Seville-Córdoba-Madrid Avenue와 관련된 Proposición no de Ley 7-04/PNLP-000009. 안달루시아 농촌 지역 중년 근로자의 재활 및 사회 발전에 관한 Ley
대통령 부인 의 제안 7-04/PNLP-000001. 대통령의 아내
다음을 포함하는 파일을 얻고 싶습니다.
Seville-Córdoba-Madrid Avenue와 관련된 Proposición no de Ley 7-04/PNLP-000009.
대통령의 아내
또 다른 내용은 다음과 같습니다.
Ley 7-04/PNLP-000001 안달루시아 시골 지역 중년 근로자의 재활 및 사회 발전에 관한 제안.
대통령의 아내
이 코드를 사용하여 수행하려고 합니다.
gawk '
/^\n.+[0-9]\-[0-9]{2}\/.+\-[0-9]{6}$/
{if (p) close (p)
p = sprintf("split%05i.txt", ++i) }
{ print > p; }
' input.txt
그러나 이는 내용에 관계없이 한 줄에 하나의 파일만 생성합니다. 내가 뭘 잘못하고 있는지 아는 사람 있나요? 미리 감사드립니다!
답변1
거의 완료되었습니다:
awk '/[0-9]-[0-9]{2}\/[[:upper:]]+-[0-9]{6}/ {
if (file) close (file)
file = sprintf("split%05i.txt", ++i)
}
file {print > file}' input.txt
패턴 과 일치하는 { if... }
행에 대해 코드 블록을 실행 하려고 하므로 .[0-9]...
/.../
두 번째 코드 블록은 {print > file}
모든 레코드 세트에 대해 실행되고 조건으로 사용됩니다.file
file
여기서 패턴은 차례로 처리되는 각 레코드가 각 행의 내용이므로(기본 레코드 구분 기호( )는 입니다 ) 레코드에 개행 문자가 포함되지 않기 때문에 \n
의미가 없습니다 . 또한 여기에 정규식을 고정하고 싶지 않습니다( 및 ).awk
RS
\n
^
$
.+
좀 더 구체적 으로 설명하기 위해 귀하의 것을 대체했습니다 [[:upper:]]+
. 예를 들어 의 경우 .+
와 일치합니다 blah 5-10/2 blah blah €1000000
. 당신이 받아들이고 싶은 것에 따라 조정이 필요할 수도 있습니다 PNLP
.
또한 패턴과 일치하는 문자열이 포함되어 있으므로 일치한다는 점에 유의하세요(굵게 표시).blah 1234-56/XX-1234567890 blah
코드가 구체적이지 않기 때문에 g
in을 제거했습니다 . 그러나 위의 / 연산자를 지원하지 않는 일부 awk 구현이 여전히 있다는 점에 유의하십시오(POSIX 요구 사항임에도 불구하고). 이를 사용할 수 있다는 것을 안다면 이를 사용하여 작동하는지 확인하는 것이 좋습니다.gawk
gawk
{2}
{6}
gawk
답변2
나는 이렇게 할 것이다:perl -ne 'my $fh="/dev/stdout"; if(/7-04\/PNLP-(\d+)/) { close $fh; open($fh,">/path/to/outputfiles/file$1"); } ; print $fh $_;' < /path/to/inputfile