AWK 파일에 범위 삽입

AWK 파일에 범위 삽입

CLI로 전달될 때 AWK 범위의 수많은 예를 발견했습니다. 예를 들어:

awk '/start/,/end/' file

AWK 파일에 범위를 포함하는 방법은 무엇입니까?

#!/usr/bin/awk -f

BEGIN{
}
{
   # how do I express those "start" and "end" ranges?
}
END {
}

내 텍스트 파일은 다음과 같습니다.

...
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

답변1

awk 스크립트의 본문은 다음과 같은 형식을 갖습니다.

*pattern* *action*

이들 중 하나는 생략될 수 있습니다. 생략무늬평균행동항상 실행됩니다. 생략행동기본적으로 현재 줄이 인쇄됩니다.

범위를 표현하는 자연스러운 방법은 다음과 같습니다.무늬부분은 다음과 같습니다.

BEGIN {
  somevar=5
}

/start/,/end/ { print }

END {
  somevar=6
}

(시작했을 때와 동일한 구조를 유지하기 위해 BEGIN 및 END 섹션을 그대로 두었습니다.)

~에 있다행동위치를 추적하는 데 필요한 사항은 다음과 같습니다.

BEGIN {
  p=0
}

{
  if (/start/) p=1
  if (p) { print }
  if (/end/) p=0
}

END {
  p=0
}

여기, 아니무늬, 그래서행동블록은 각 행에 대해 실행됩니다. /와 일치하는 줄이 보이면 p플래그( )를 1 또는 "true"로 설정합니다. /start플래그가 true인 경우에만 해당 줄을 인쇄합니다. /가 보이면 /end플래그가 재설정됩니다. 여기서 BEGIN 및 END 블록은 중복되며 awk 기본값은 0/false입니다.

답변2

oot@localhost ~]# i=`awk '/care/{print NR}' l.txt| sort -nr| sed -n '1p'`
[root@localhost ~]# awk -v i="$i"  '/care/{x=NR+i}(NR<=x){print }' l.txt
don't care
don't care
start
record of interest
record on interest
...
end
don't care
don't care
...

관련 정보