awk:レコードをパターン一致に設定し、最後のレコードのみを印刷します。

awk:レコードをパターン一致に設定し、最後のレコードのみを印刷します。

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変形ソリューションと同じですが、変数の代わりに予約済みスペースを使用して各レコードの行を累積します。

関連情報