シェルワンライナー #8

問題

183.YY.129.XX - - [07/Nov/2017:22:37:38 +0900]
...

こういう入力で午前と午後の行を数える

回答

cat access.log | awk '{split($4,a,":"); print a[2]}' | awk '{if($1>=0 && $1<12) am++; else pm++; } END{print "AM:" am ", PM:" pm}'

出力結果

AM:2, PM:3

  • $4をsplitで”:”で区切って配列に入れる。
  • 時間の要素のみ出力
  • 0-11だったら AM, 12-23だったらPMでカウント
  • AM: x 行、PM: y みたいな感じで出力

補足

  • テキストに似た答えはなかった。
  • テキスト答えは
    • awk -F: でコロンを空白に置き換える
    • $(NF-2) で列数 - 2 即ち 後ろから3つ目で時間部分を抽出し出力
    • それをawkのフィルタで午前、午後の条件、アクションを条件に応じて「午前」or「午後」と出力
    • その出力結果を sort
    • その出力結果を uniq -c で集計して出力