bash – 如何有效地列出具有’n`行的文件?
为了列出具有n行的文件,可以做到
n=5 find . -name "*.txt" | xargs wc -l | awk -v n=${n} -F" " '{if ($1==n) {print $2} }' 但是这个解决方案非常慢,因为它先计算每个文件的行数,然后只选择那些有n行的行.当一行到达n 1行时计算行和停止的过程会更有效(特别是在处理有大量行的大文件时). 如何有效地列出具有n行的文件? 请注意,对于特殊情况,每条线的大小完全相同,那么人们可能会这么做 n=5 sizePerLine=500 find . -name '*.txt' -size $(( ${n} * ${sizePerLine} )) 解决方法
我认为以下会更快:
find . -name "*.txt" -exec awk -v n="$n" 'FILENAME != prevfile {if(prevfnr==n) print prevfile} {prevfile = FILENAME; prevfnr = FNR; if(FNR>n) {nextfile;}} END{if (FNR==n) {print FILENAME} }' {} + 这个怎么运作: >使用-exec … {}使用find为每个文件执行命令,并让它在每次调用时传递多个args 有趣的是,我发现这实际上给出了与使用wc -l的版本不同的结果,尽管我认为这个实际上可能更正确.对于我的目录中最后一行不包含行结束字符的文件,wc -l将报告行数,不计算最后一个“未终止”行,但此处的解决方案将计算它. Arg,我没有意识到nextfile是一个GNU-ism.如果我已经限制自己,我们就可以把它变得更加清洁 find . -name '*.txt' -exec awk -v n="$n" 'FNR > n {nextfile;} ENDFILE{if (FNR==n) {print FILENAME} }' {} + 在我看来POSIX awk没有一个很好的快捷方式来跳转到下一个文件,这是该解决方案需要的关键效率 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |