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

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

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

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(メモリに)保存する量の制限が比較的低い。

答え2

GNUの使用awk:

awk 'BEGIN{FS="######################\n"; RS=""} {print $NF}' file

出力:

データ5
データ6

$NF最後の列が含まれます。

望むより:8つの強力なawk組み込み変数 – FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

答え3

以下はユニークな一行です。

tail -n+$(( $(grep -nF '######################' test.txt | tail -1 | cut -d: -f1) + 1)) test.txt

そしてもう少し合理的な別の説明

last_delimiter_line=$(grep -nF '######################' test.txt | tail -1 | cut -d: -f1)
data_line_num=$((last_delimiter_line + 1))
tail -n+$data_line_num test.txt
  • ファイル内のすべての区切り文字を検索しgrep、一致する各項目と見つかった行番号を印刷します。
  • tail最後のゲームを除いてすべて削除
  • cut見つかった最後の区切り文字の行番号を抽出します。last_delimiter_line
  • 印刷する最初の行は次のようになり、last_delimiter_line次のように保存されます。data_line_num
  • 最後のtailコマンドは、test.txt行から始まるすべての内容を印刷します。data_line_num

関連情報