加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何有效地列出具有’n`行的文件?

发布时间:2020-12-16 01:53:05 所属栏目:安全 来源:网络整理
导读:为了列出具有n行的文件,可以做到 n=5find . -name "*.txt" | xargs wc -l | awk -v n=${n} -F" " '{if ($1==n) {print $2} }' 但是这个解决方案非常慢,因为它先计算每个文件的行数,然后只选择那些有n行的行.当一行到达n 1行时计算行和停止的过程会更有效(特
为了列出具有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
> awk -v n =“$n”调用awk并定义一个名为n的awk变量,其值与shell变量n相同
> FILENAME!= prevfile {if(prevfnr == n)print prevfile检查当前文件是否与最后一条记录相同,如果没有,则查看前一个文件是否有n条记录,如果是,则打印出该名称文件
> {prevfile = FILENAME; prevfnr = FNR; if(FNR> n){nextfile;}}使用当前的FILENAME更新prevfile变量,使用当前FNR更新prevfnr变量.此外,如果我们当前的文件记录超过n,则跳转到下一个文件而不在此处处理更多内容
> END {if(FNR == n){print FILENAME}在最后查看最后一个文件是否也有n条记录

有趣的是,我发现这实际上给出了与使用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没有一个很好的快捷方式来跳转到下一个文件,这是该解决方案需要的关键效率

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读