AWK에는 줄 번호가 아닌 줄의 텍스트를 기반으로 줄 범위를 찾는 SED와 유사한 기능이 있습니까?

AWK에는 줄 번호가 아닌 줄의 텍스트를 기반으로 줄 범위를 찾는 SED와 유사한 기능이 있습니까?

해결 방법: 파일은 LF 개행 대신 CR을 사용하여 저장됩니다. Mosvy가 이 점을 지적했지만 답변이 아닌 댓글로만 게시했기 때문에 원인을 찾고 문제를 해결할 수 있도록 도와주신 것에 대해 공식적으로 감사를 표할 수는 없습니다.

mosvy님, 감사합니다. 다시 오시면 제가 엄지손가락을 치켜세울 수 있도록 답변을 게시해 주세요.

SED에는 다음이 있는 것 같습니다.

sed '3,10d;/<ACROSS>/,$d' input.txt > output.txt

(3-10행을 삭제한 다음 "<ACROSS>"가 포함된 행부터 파일 끝까지 삭제한 다음 출력을 작성합니다.)

그냥 시도해도:

sed '3,10d' input.txt > output.txt

하지만 어떤 이유에서인지 내 Mac에서는 두 방법 모두 작동하지 않는 것 같습니다.

무엇을 더 시도해야 할지 모르겠습니다.

AWK에도 비슷한 것이 있었으면 좋겠습니다.

고쳐 쓰다:

내가 입력할 때:

sed '3,10d' input.txt > output.txt

3~10행은 삭제되지 않습니다. 단지 전체 파일을 output.txt로 반환합니다.

내가 시도할 때:

sed '/<ACROSS>/,$d' input.txt > output.txt

Output.txt가 비어 있습니다.

또한 저는 10.9.4를 사용하고 있습니다.

** 업데이트 2:

고마워요 모비! ! 귀하의 의견에 찬성 투표를 할 수 있었으면 좋겠습니다. 이것이 문제 해결사입니다.

파일은 LF 개행 대신 CR로 저장되었습니다.

변환하니 다 해결됐네요.

기여해주신 모든 분들께 감사드립니다.

답변1

/usr/bin/sed '3,10d'내 Mac(Mojave)에서 잘 작동합니다. 그럼에도 불구하고 awk를 사용하면:

awk '(NR >= 3) && (NR <= 10) {next} /<ACROSS>/{exit} 1'

...줄 번호가 3에서 10 사이이면 줄을 건너뛰고 가 있는 <ACROSS>줄에 도달하면 종료됩니다(다른 모든 항목은 인쇄됩니다).

답변2

귀하의 sed는 잘 작동합니다. 그럼에도 불구하고 Awk에는 여전히 , --"Between" 연산자 가 있습니다. 다음은 몇 가지 예입니다(기본 작업 = 인쇄).

"start"와 "stop" 사이의 줄을 인쇄하세요.

awk '/start/,/stop/'

3호선과 10호선 사이의 노선

awk 'NR==3, NR==10'

<ACROSS>줄 사이와 끝

awk '/<ACROSS>/, 0'

(0은 거짓이므로 끝나지 않습니다)

답변3

OP의 문제는 예상대로 줄 종결자로 CR( \r/ascii 10) 대신 LF( /ascii 13)을 사용하는 파일로 인해 발생합니다 . using은 Mac을 사용 하지 않는 사용자로서 클래식 MacOS에서 사용 되는 규칙입니다. 지난 20년 동안 제가 경험한 유일한 용도는 PDF 파일에서 입니다 . in은 정규 표현식이 될 수 없습니다).\nsedCRperlRSmawkgawk$/perl


제목의 질문에 따르면, 그렇습니다. awk범위 모드가 지원되며 정규식과 줄 번호 조건부(또는 모든 표현식)를 자유롭게 혼합할 수 있습니다. 예를 들어:

NR==1,/rex/   # all lines from the 1rst up to (and including)
          # the one matching /rex/

/rex/,0   # from the line matching /rex/ up to the end-of-file.

awk마지막 술어가 범위를 시작하는 행과도 일치할 수 있으므로 sed범위 는 범위와 다릅니다 . 의 동작은 다음과 같이 시뮬레이션할 수 있습니다.awksed

s=/start/, !s && /last/ { s = 0; print }

그러나 in의 범위는 awk실제로 표현식이 아니기 때문에 여전히 매우 제한적입니다(부정할 수 없고 다른 표현식의 일부가 될 수 없으며 in에서 사용할 수 없음 if(...)등). 또한 이것은 마술이 아닙니다. 범위와 같은 것을 표현하기 위해 "컨텍스트"를 사용하려는 경우(예 /start/-4,/end/+4: ) 자체 순환 버퍼와 추가 논리를 롤링해야 합니다.

관련 정보