Bash shell脚本:根据字段分隔符计算文件中每个段落的行数?

时间:2014-05-08 07:31:18

标签: bash shell awk

我想分析日志文件,但在这种情况下仍然存在:

实施例: 我有一个格式如下的文件:

140508  0:00:19 10 abc  def
            9  djdj djdjd
            12 fjfj fjfjj                       
140508  0:00:24         10 dhdh dhdh
            19 dddh  hdhdhd
            1838 jcjj ddhfhfh
            17 fhfhh fhfhfh
140508  0:00:29         10 ababa cbcbc

字段分隔符为140508(YYMMDD)。

我想根据字段分隔符输出每个段落中的行数:

140508  0:00:19 3
140508  0:00:24 4
140508  0:00:29 1

感谢。

3 个答案:

答案 0 :(得分:3)

使用awk:

awk '/^[0-9]{6} /{if (c) print a, b, c; a=$1; b=$2; c=1; next} {c++} END{print a, b, c}' file
140508 0:00:19 3
140508 0:00:24 4
140508 0:00:29 1

答案 1 :(得分:1)

使用awk

awk '/:/{h=$1 FS $2}{a[h]++}END{for (i in a) print i,a[i]}' file

解释

  • /:/{h=$1 FS $2},仅在:行上工作,并生成数组a的索引。
  • {a[h]++}总结该指数的时间。
  • {for (i in a) print i,a[i]}浏览数组a并执行打印作业。

答案 2 :(得分:1)

使用GNU awk

awk --re-interval -v RS='(^|\n)[0-9]{6} ' \
 '$0=="" {sep=RT; next}  {print sep $1, 1+gsub("\n.",""); sep=substr(RT,2)}'  file

注意:如果您的gawk版本为> = 4.0,则不需要--re-interval选项。

说明:

  • 日期表达式[0-9]{6} 用作记录分隔符(RS),它自动将输入拆分为所需的段落;在它前面加(^|\n)可确保只在行的开头执行匹配。
  • RT包含与RS正则表达式匹配的文字记录终结符;它保存在sep变量中,用于处理 next 记录。
    • 请注意,由于输入以记录分隔符启动,因此报告的第一条记录为 - 因此$0==""模式和相关操作。
    • 对于所有后续记录,必须从分隔符中删除初始\n,这是substr()调用所做的。
  • 1+gsub("\n.","")是一个小技巧,实际上只是计算记录中非空行的数量(gsub()返回替换次数)。