
ファイルの最後の区切り文字の後のすべてのデータを印刷するには?ファイルデータは次のとおりです。
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
最後の列が含まれます。
答え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