假设我有超过3000个文件file.gz
,其中有很多行,如下所示。字段以逗号分隔。我想只计算第21个字段今天的日期(例如:20171101
)。
我试过了:
awk -F',' '{if { $21 ~ "TZ=GMT+30 date '+%d-%m-%y'" } { ++count; } END { print count; }}' file.txt
但它不起作用。
答案 0 :(得分:2)
使用awk
,如下所示
awk -F"," -v toSearch="$(date '+%Y%m%d')" '$21 ~ toSearch{count++}END{print count}' file
date '+%Y%m%d'
以您请求的格式生成日期,例如20170111
。然后在21st
字段上匹配该模式并计算事件并将其打印在END
子句中。
我不确定Solaris
grep
版本的-c
是否支持grep -c "$(date '+%Y%m%d')" file
标记来计算模式匹配的数量,如果是这样,您可以将其作为
scales::percent(m)
答案 1 :(得分:1)
使用gnu-grep
grep -Ec "([^,]*,){20}$(date '+%Y%m%d')" file
说明 ([^,]*,){20}
表示要检查日期前的20个字段
答案 2 :(得分:1)
使用awk和进程替换来解压缩一堆gz并将它们提供给awk进行分析和计数:
$ awk -F\, 'substr($21,1,8)==strftime("%Y%m%d"){i++}; END{print i}' * <(zcat *gz)
说明:
substr($21,1,8) == strftime("%Y%m%d") { # if the 8 first bytes of $21 match date
i++ # increment counter
}
END { # in the end
print i # output counter
}' * <(zcat *gz) # zcat all gzs to awk
答案 3 :(得分:0)
使用grep
和cut
代替awk
并避免使用正则表达式:
cut -f21 -d, file | grep -Fc "$(date '+%Y%m%d')"
答案 4 :(得分:0)
如果Perl是一个选项,此解决方案适用于所有3000个gzip压缩文件:
zcat *.gz | perl -F, -lane 'BEGIN{chomp($date=`date "+%Y%m%d"`); $count=0}; $count++ if $F[20] =~ /^$date/; END{print $count}'
使用以下命令行选项:
-l
在处理之前删除换行符,然后将其添加回来-a
autosplit模式 - 将输入行拆分为@F
数组。默认为在空格上拆分。-n
循环输入文件的每一行 -e
执行perl代码
-F
autosplit修饰符,在这种情况下拆分为,
BEGIN{}
在主循环之前执行
$date
和$count
变量已初始化
$date
变量设置为shell命令date "+%Y%m%d"
$F[20]
是@F
中的第21个元素
如果第21个元素以$date
开头,则递增$count
END{}
在主循环