7-13행 사이에 특정 문자열이 포함된 내용을 인쇄합니다(awk 스크립트).

7-13행 사이에 특정 문자열이 포함된 내용을 인쇄합니다(awk 스크립트).

특정 문자열이 포함된 7-13행 사이의 행을 인쇄하는 스크립트(.awk)를 작성하려고 합니다. 부분적으로 작동하지만 7-13 사이의 줄뿐만 아니라 해당 문자열을 포함하는 모든 줄을 인쇄합니다.

#!/usr/bin/awk -f
BEGIN { (NR>=7) && (NR<=13) }
/word/ {print $0}

런타임 출력

script.awk filename

다음 단어를 포함하는 모든 줄입니다.

편집하다:

Jeff의 제안을 시도한 후 나는 그의 조언을 얻었습니다. /needle/이 키워드입니다.

암호 암호 해결되었습니다!

문제는 다른 언어에 익숙하기 때문에 다른 줄에 {print $0}이 있다는 것입니다. 코드를 분리하는 것을 좋아합니다

답변1

실행될 "BEGIN" 블록에 행 제한 논리를 배치했습니다.앞으로 awk모든 데이터를 읽으십시오. 이 논리를 기본 루프로 이동합니다.

NR >= 7 && NR <= 13 && /word/ { print }

$0주어지지 않은 경우 기본 print인수입니다...또는 더 짧습니다.

NR >= 7 && NR <= 13 && /word/

지정하지 않으면 이후가 {print}기본 작업입니다. 스크립트
의 본문은 awk원하는 작업 앞에 패턴을 추가하려는 "패턴" "작업"의 형태를 취합니다. 여기서 패턴은 세 가지 테스트가 모두 참이어야 하며 작업은 라인을 인쇄하는 것입니다. 별도의 줄에 넣는 것은 print테스트가 "통과"될 때 "작업"이 없으며 각 줄을 인쇄하는 "모드"가 없어 모든 줄이 인쇄된다는 의미입니다.

답변2

그냥 보충제제프의 ​​대답그 중 하나는 다음과 같습니다 sed.

sed -n '7,13 { /expression/ p; }' <file

그러면 정규식과 일치하는 7행과 13행(포함) 사이의 모든 행이 인쇄됩니다 expression. 출력은 기본적으로 꺼져 있으므로 -n명령을 사용하여 명시적으로 인쇄된 행만 p출력됩니다.

위 스크립트를 sed다음으로 직접 번역하세요 awk.

awk 'NR == 7, NR == 13 { if (/expression/) print }' <file

이 조건은 "7의 입력 레코드에서 13의 입력 레코드까지 NR == 7, NR == 13"로 이해되어야 합니다 . 여기서 "입력 레코드"는 기본적으로 지금까지 읽은 레코드(라인) 수인 한 라인으로 설정됩니다.NRNRNR

답변3

어때요?

awk 'NR>6&&NR<14&&/word/' file

관련 정보