単語数が100個が少し以上の3つの小さな段落があるとしましょう。最後の段落だけを表示するにはどうすればよいですか?
答え1
awk
段落モードを使用できます(RS
空の場合、段落は一連の空白行に分割され、先行空白行と末尾空白行は無視されます)。
awk -v RS= 'END{print}' < file.txt
入力ファイルに段落が含まれていない場合(空白または空白行のみが含まれている場合)、空白行が印刷されます。これを防ぐには、上記の内容を次のように変更できます。
awk -v RS= 'END{if (NR) print}' < file.txt
(NR
数量です記録(この場合節)ファイルから)。
答え2
段落が空行で区切られていると仮定すると、次のことが機能します(3つの「テスト」インスタンスをファイル名に置き換えます)。
tail -n `expr $(wc -l test | cut -f1 -d' ') - \
$(grep -ERn '^$' test | tail -n1 | grep -o '[0-9]\+')` test
より簡単な解決策があると確信しています。ここでは、最後の空行を探し、grep -ERn '^$' test | tail -n1
最初の空行の前のすべてを削除します。tail
答え3
入力に後ろに空白行がないと仮定すると、次のように実行できます。
sed 'H;/^$/h;$!d;x' infile
これにより、予約されたスペースが各段落の内容で上書きされ、スワップバッファの最後の行を除くパターンスペースが削除されます。出力の先頭に空白行が表示されますが、これは簡単に削除できます。練習用に残しておきます。
答え4
洗練されたキャプテンキャップ答えを得るには、より簡単な作業を実行できますawk
。
tail -n$(tac myFile.txt | awk '/^$/{print NR-1; exit}') myFile.txt
段落が空行で区切られているか、空白のみが含まれているとします。
tac
編集:実際に機能するには、との間に混乱がrev
あります。tac
編集:ファイルに空白行が続くのが心配な場合は、次の方法で問題を解決できますawk
。
tail -n $(tac myFile.txt | \
awk 'BEGIN{i=1} /^$/{if (NR == i) {i++} else {print NR-1; exit}}') \
myFile.txt
テストしてみた結果、期待通りに動作するようです!