计算匹配特定字符串的文件中的行

时间:2017-01-11 16:31:28

标签: bash shell awk solaris

假设我有超过3000个文件file.gz,其中有很多行,如下所示。字段以逗号分隔。我想只计算第21个字段今天的日期(例如:20171101)。

我试过了:

awk -F',' '{if { $21 ~ "TZ=GMT+30 date '+%d-%m-%y'" } { ++count; } END { print count; }}' file.txt

但它不起作用。

5 个答案:

答案 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)

使用grepcut代替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{}在主循环

之后执行