다음 줄(`+N` 옵션)과 빈도(`~N`)로 sed

다음 줄(`+N` 옵션)과 빈도(`~N`)로 sed

나는 sed를 사용하여 10줄(10, 11, 20, 21, 30, 31,...)마다 2줄의 텍스트를 검색하려고 합니다.

sed -n '10,11p' file10행과 11행의 경우 또는 를 사용할 수 있습니다 sed -n '10,+1p' file. 범위(10일, 20일, 30일, ...)의 경우 sed -n '10,~10p' file. 하지만 어떻게든 이 둘을 결합하는 것이 가능할까요?

sed -n '10,~10,+1p' file작동하지 않습니다.

중복인 것 같은데 참조를 찾을 수 없습니다. 감사해요!

답변1

ADDR1,ADDR2FIRST~STEPas ADDR1+OFFSETas 와 함께 사용됩니다 ADDR2.

$ seq 30 | sed '10~10,+1!d'
10
11
20
21
30

~그럼에도 불구하고 및 둘 다 +비표준 GNU 확장이라는 점에 유의하십시오 .

자세한 내용은 info sed 'line selection'GNU 시스템을 참조하세요.info sed 'range of lines'

POSIXly에서는 다음을 사용합니다.

seq 30 | sed -n '1n;n;n;n;n;n;n;n;n;p;n;p'

답변2

어떤 해결책이 있습니까 awk?

awk '(FNR>1) && (FNR%10<2)' file
  • FNRawk각 파일의 라인 카운터를 자동으로 업데이트합니다.
  • "true"(문자열일 수 있음)로 평가되는 "규칙 블록"( ) { ... }외부의 모든 조건은 지금까지 수행된 모든 수정 사항을 포함하여 현재 행을 인쇄하도록 지시합니다.1awk
  • 따라서 (FNR>1) && (FNR%10<2)현재 줄이 첫 번째 줄이 아니고 줄 번호가 10의 배수(또는 최대 +1)인 경우 현재 줄이 인쇄됩니다. 이는 "10줄 이하마다"와 같습니다.

답변3

awk를 사용하면 그림과 같이 실행할 수 있습니다. NR은 awk 용어의 줄 번호입니다.

$ awk 'NR ~ /.[10]$/'  file

sed아래와 같이 이를 수행하여 10개의 줄 바꿈에 도달할 때까지 예약된 공간을 늘릴 수 있습니다 .

$ sed -nE 'x
  /\n{9}/{
    z;x;$d
    N;p;D
  }
  s/$/\n/;h
' file
$ perl -ne '$.%10||print($_.<>)' file

관련 정보