计算给定阈值的行匹配数和返回文件名以及计数

时间:2016-02-12 10:29:15

标签: bash loops unix awk

我有数百个文件夹,文件(file.tsv)包含四列,我想计算一列匹配给定阈值的行数。

例如:file.tsv(所有文件包含相同的数据格式)

S.No age weight height  
1    25  65     175  
2    28  75     180  
3    24  72     179  
4    26  80     190  

我可以使用命令获取计数:

for i in $(find . -name '*.tsv'); do awk '$3>=70' $i | wc -l ; done  

它提供类似

的输出
  

3

但我需要输出:

  

file.tsv 3

3 个答案:

答案 0 :(得分:1)

也许是这样的?

for i in $(find . -name '*.tsv'); do echo -n "$i: " ; awk '$3>=70' $i | wc -l ; done

这基本上是你的解决方案,只是打印文件名,在awk之前添加一个简单的echo -n "$i:

我会以稍微不同的方式实现它:

find . -name '*.tsv' -print0 | xargs -0 -I {} awk '{if($3 >= 70) { count++ ;}} END{print FILENAME,count}' {}

答案 1 :(得分:1)

你差不多......


    for i in $(find . -name '*.tsv'); do 
    awk 'BEGIN {ctr=0} 
         $3+0 >= 70 { ctr++ } 
         { next } 
         END { print FILENAME " " ctr }' $i; 
    done

通过在END块中测试ctr,您还可以禁止文件没有$3 >= 70,或者文件太少 (编辑纠正了OP评论中指出的缺陷)

答案 2 :(得分:1)

你需要的是:

find . -name '*.tsv' |
xargs -n 1 awk '(NR>1) && ($3>=70){ctr++} END{print FILENAME, ctr+0}'

如果您的文件名可以包含换行符,请将-print0添加到find,将-0添加到xargs