如何在bash中计算满足时间条件的行数?

时间:2018-01-11 18:24:15

标签: bash unix command-line terminal

我有一个包含1000行各种纪元时间的txt文件(1396848990 = 2014年4月6日星期二太阳报6:36:30)。如何计算晚上8点到午夜之间发生的行数。

3 个答案:

答案 0 :(得分:1)

您可以使用awk执行以下操作:

awk 'int(strftime("%H", $1)) >= 20 {print $1}' $input_file | wc -l

它会使用strftime()将unix纪元时间戳转换为小时(%H),将其转换为整数(int())并与数字20进行比较。如果数字是更大 - 打印时间戳。

在外面,wc可以计算打印的行数。

当然,您也可以使用awk

awk 'int(strftime("%H", $1)) >= 20 {n+=1} END{print n}' $input_file

它会默默地将变量n初始化为零,并在结尾打印结果。

修改:strftime()似乎exist in GNU awk

$ awk -V
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)

答案 1 :(得分:0)

虽然awk肯定更快更容易阅读,但我认为你只能使用(现代)bash来做到这一点。

这样的事情应该有效:

let counter=0; (while read -ra epoch; \ 
do [ $(printf "%(%H)T" ${epoch[0]}) -ge 20 ] && \ 
let "counter++"; done; echo $counter) <inputfile

它像Pavels一样回答,但用bash的printf来格式化日期(可能仍然在窗帘后面strftime)。
read数组(-a)和let counter++仅适用于现代bash(4?)

答案 2 :(得分:0)

如果您的private string Utf8y(string a) { return Encoding.UTF8.GetString(Encoding.Default.GetBytes(a)); } 命令支持-d( - 日期)选项,那么如何:

date