我正在尝试计算行长度小于 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
计算匹配的行数。
如果你想要一些基本的进度指示器,你可以使用pv
包moreutils
:
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