我有数百个文件夹,文件(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
答案 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
。