最後の区切り記号の後のすべてのデータを印刷します。

最後の区切り記号の後のすべてのデータを印刷します。

ファイルの最後の区切り文字の後のすべてのデータを印刷するには?ファイルデータは次のとおりです。

data1
data2
######################
data3
data4
######################
data5
data6

印刷したい:

data5
data6

#####################は区切り文字であるためです。

*行数が不明です。

私は試した:

$ cat file | awk -F "#"  '{print $NF}'

ただし、出力は次のようになります。

data1
data2
data3
data4
data5
data6

ベストアンサー1

awk以下と組み合わせて使用​​してくださいtac(一部のシステムにもtail -rこの機能があります):

$ tac file | awk '/^#+$/{exit} 1' | tac
data5
data6

tacまたは、まだ/がない場合は、tac同様の関数を直接作成してくださいtail -r(これはcat非標準-nオプションをサポートしていると仮定し、サポートしていない場合はawk -v OFS='\t' '{print NR, $0}'代わりに使用してくださいcat -n)。

$ mytac() { cat -n -- "$@" | sort -rn | cut -f2-; }
$ mytac file | awk '/^#+$/{exit} 1' | mytac
data5
data6

awkまたは、1つもなく自分で作成したくない場合は、tacどちらかを単独で使用してください。

$ awk '{rec=rec $0 ORS} /^#+$/{rec=""} END{printf "%s", rec}' file
data5
data6

あるいは、ファイルがすべてを一度にメモリに読み込むことができるほど小さい場合は、awk複数文字にGNUを使用してください。RS

$ awk -v RS='^$' -v ORS= -F'(^|\n)#+(\n|$)' '{print $NF}' file
data5
data6

または、GNU awkを再利用して複数文字のRSを実行し、END部分の最後の$ 0値を保持します。

$ awk -v RS='(^|\n)#+(\n|$)' -v ORS= 'END{print}' file
data5
data6

上記のすべての機能は、入力がファイルに保存されているかパイプから出ているかに関係なく機能します。なぜなら、入力を一度だけ読むからです。ファイルに保存されていて2回読み取れる場合は、さまざまなツールの組み合わせを使用して次のようなさまざまなオプションを使用できます。

$ tail -n +"$(awk '/^#+$/{n=NR} END{print n+1}' file)" file
data5
data6

1 ただし、検索できないファイル (パイプなど) の場合、入力はtac// 経由でメモリにtail -r一時保存するか、sort一時ファイルに保存する必要があります。一部のシステムでは、tail -r(メモリに)保存する量の制限が比較的低い。

おすすめ記事