私の出力は次のとおりです
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/'
1行だけの段落を報告します。
技術的には、ファイルに以下が含まれている場合:
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