위와 아래에 빈 행이 있는 행 선택

위와 아래에 빈 행이 있는 행 선택

내 출력은 다음과 같습니다

A
A
A

B

A
A
A

C

A
...

빈 줄로 둘러싸인 줄을 필터링하고 싶습니다.
이 예에서는 B등이 될 것 C입니다 .

답변1

awk는 입력을 "단락"으로 읽거나 RS빈 문자열로 설정된 경우(GNU awk). ( RS비슷하게 설정 \n\n+하지만 정확히 동일하지는 않습니다.) 그러면 개행 문자가 포함되지 않은 모든 레코드를 인쇄할 수 있습니다.

$ awk -vRS= '$0 !~ /\n/' file1
B
C

첫 번째 줄과 마지막 줄 뒤에 각각 빈 줄이 있거나 앞에 있으면 첫 번째 줄과 마지막 줄도 인쇄되어 파일의 시작과 끝을 "빈 줄"로 효과적으로 처리합니다. 다음과 같이 실제 빈 줄을 원하는 경우:

awk 'BEGIN {lines=2} /^$/ {if (lines == 1) print prev; lines=0 } 
     !/^$/ {lines += 1}  {prev=$0}' file1

답변2

노력하다:

awk -v RS= '!/\n/'

한 줄만 있는 단락을 보고합니다.

기술적으로 파일에 다음이 포함된 경우:

A

B
C

D

E

이는 앞에 빈 줄이 없는 A경우 에도 보고됩니다 .E

위의 내용 만 원할 경우 D다음과 같이 할 수 있습니다.

awk '
  {
    if ($0 != "") {
      ok = wasempty
      wasempty = 0
    } else {
      if (ok) print last
      ok = 0
      wasempty = 1
    }
  }
  ok {last = $0}'

답변3

첫 번째/마지막 행 주위에 빈 줄이 있어서 제외되는 경우:

$ cat ip.txt 
A0

B1

A2

A
A

C3

AN
$ awk 'NR>=3 && p2~/^$/ && p1~/./ && /^$/{print p1} {p2=p1; p1=$0}' ip.txt 
B1
A2
C3
  • NR>=3조건을 일치시키려면 행이 3개 이상 필요합니다.
  • {p2=p1; p1=$0}마지막 줄 p1과 마지막 줄을 저장하세요p2
  • p2~/^$/ && p1~/./ && /^$/빈 줄에 공백이 없어야 하고 일치할 줄이 비어 있지 않다고 가정하여 주어진 조건과 일치합니다.

답변4

perl -l -0777ne 'print for /(?:^|\n)\n\K.+(?=\n\n)/g' yourfile

설명하다:

우리는 파일을 읽고 전체 파일은 레코드입니다. 이 단일 레코드에서는 islands2개의 연속 라인으로 시작하고 그 뒤에 2개의 줄 바꿈이 이어지는 레코드를 확대합니다 . 이들 모두는 루프로 인쇄 islands됩니다 .for


sed -e '
   /./d      # skip a nonempty line
   $!N       # grab the line following an empty line
   /^\n$/D   # if we have 2 consecutive empties, clip the former, n branch to top
   $!N       # we now have ^\nLine\n...
   /\n$/!D   # clip if the seq ^\nLine\n$ not found
   s/.//     # found it! ^\nLine\n$
   P;D       # 
' yourfile

관련 정보