我的输出如下所示:
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