awkを使用してパターンマッチング後に最後のレコードのみを出力する方法はありません。
各「記録」はDATEで始まり、ダッシュで終わります。
私は以下を試しましたが、運がありません。
awk '/02\/21\/19/,/---/; END{print}' sample.file
しかし、これは私が期待した最後のレコードではなく、すべてのレコードを提供するだけです。
サンプルデータ:この2つの完全なレコードを呼び出します。与えられた時間に最後の1つだけが必要です。
02/21/19 14:00:00 - 15:00:00
Total:
ID Total Approved Rejected
All 1 0 ( 0%) 1 (100%)
Total By Consumer:
ID Total Approved Rejected
123 1 0 ( 0%) 1 (100%)
Total By Supply:
ID Total Approved Rejected
3878 1 0 ( 0%) 1 (100%)
--------------------------------------------------------
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
また、sedがうまくいくと思いましたが、それでもエラーが発生します。
sed -n '/02\/21\/19/,/----/,$p'
sed: -e expression #1, char 20: unknown command: `,'
予想される出力は最後のレコードです。
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
どんなアイデアがありますか?
答え1
履歴が行で区切られ---
、提供された日付のうち最後の日付を印刷するには、次のように使用できます。
awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}'
前任者。
$ awk -v RS='\n-+' -v d='02/21/19' '$1 == d {x = $0} END {print x}' data
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
GNU awkがあり、レコード区切り文字を保持するには、x = $0
次のように変更します。x = $0 RT
答え2
コマンドの最初と最後の部分も含むパターンマッチング '/02/21/19'を指定して、これら2つの部分を印刷します。
次の2つの方法を試してみましたが、うまくいきます。
method1: awk '/^02\/21\/19 15/,/-------/{print $0}' file.txt
method2:sed -n '/02\/21\/19 15/,/---/p' file.txt
output
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
答え3
最初のsed
コマンドはほぼ成功しましたが、構文エラーがあります。最後の部分が必要な場合は、次のようにできます。
sed -n '/02\/21\/19 15:00:00 - 16:00:00/,/190/p' file.txt
出力:
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
1)すべての内容を自動的に印刷しないように-n
指示します。sed
2) スラッシュ内のパターンが一致する必要があります。日付自体がファイル内の別の場所に表示されるため、データと時刻を最初の文字列としてまとめました。サンプルデータを提供したため、時刻も表示されます。その後、最初に表示される位置が点線の直前にあるので、190を一致させる2番目のパターンにしました。
答え4
入力データの最後のレコードだけが欲しいとしましょう。
$ awk '/\// { lines = $0; next } { lines = lines ORS $0 } END { print lines }' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
これにより、変数に入力行が蓄積されますlines
。一致する行が見つかるたびに/
(日付を含む行を検出する非常に簡単な方法)、累積行が消去され、現在の行にのみ設定され、次のサイクルに移動します。最後に、現在の累積行数が出力されます。
同等のものを使用してくださいsed
:
$ sed -n '/\//{x;d;}; H; ${x;p;}' file
02/21/19 15:00:00 - 16:00:00
Total:
ID Total Approved Rejected
All 7 0 ( 0%) 7 (100%)
Total By Consumer:
ID Total Approved Rejected
3398 7 0 ( 0%) 7 (100%)
Total By Supply:
ID Total Approved Rejected
3878 3 0 ( 0%) 3 (100%)
190 4 0 ( 0%) 4 (100%)
--------------------------------------------------------
このステップバイステップの方法はawk
変形ソリューションと同じですが、変数の代わりに予約済みスペースを使用して各レコードの行を累積します。