计算具有长度条件的行数

计算具有长度条件的行数

我正在尝试计算行长度小于 300 个字符的大文件中的行数。

我目前的方法是使用以下命令(但速度很慢):

awk "length<=300" *.log | wc -l

有没有更好的方法来只获取行数?

答案1

用于awk计算行数

awk 'length<=300{c++} END { print c }' *.log

在哪里

  • c++增量计数器
  • END { print c }在最后一行并打印值之后执行c

我不确定,这会更快(至少wc -l不必计算和解析行)


获取小计(可以是一行)

awk 'length<=300{t++;s++} 
     ENDFILE { printf "%s:%d\n",FILENAME,s ; s=0 ; } 
     END { printf "TOTAL:%d\n",t }' *.log

答案2

grep

cat *.log | grep -vc '^.\{301\}'

为了匹配具有长度的行,<=300我们-v对任何字符进行 grep (反向匹配)301,因为搜索模式仅限于一行grep。模式锚定在行的开头^。并-c计算匹配的行数。


如果你想要一些基本的进度指示器,你可以使用pvmoreutils

pv *.log | grep -vc '^.\{301\}'

如果你想获取每个文件的行号:

grep -vc '^.\{301\}' *.log

如果你想从上面的命令中获取总数:

grep -vc '^.\{301\}' *.log | awk -F':' '{c+=$NF} END {print c}'

根据数据的不同,虽然我们通常不grep使用管道awk,但它可能比cat&更快grep,如果有很多很长的输入行,这里的管道仅用于少量数据、数字和文件名。

答案3

使用(以前称为 Perl_6)

依赖于 shell 通配符:

raku -ne 'state $i; $i++ if .chars <= 300; END say $i // 0;'

#OR

raku -ne 'state $i; if .chars <= 300 {$i++}; END say $i // 0;'

通过正则表达式确定的文件(独立于 shell 通配):

raku -e 'for dir(test => / .+ \.log $ /) {state $i; $i++ if .chars <= 300 for .lines; END say $i // 0};'

https://docs.raku.org/syntax/state
https://docs.raku.org/routine/dir
https://raku.org

相关内容