내 출력은 다음과 같습니다
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
설명하다:
우리는 파일을 읽고 전체 파일은 레코드입니다. 이 단일 레코드에서는
islands
2개의 연속 라인으로 시작하고 그 뒤에 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