ファイルの最後の区切り文字の後のすべてのデータを印刷するには?ファイルデータは次のとおりです。
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
(メモリに)保存する量の制限が比較的低い。