行長が300文字未満の大容量ファイルの行数を計算しようとしています。
現在のアプローチは、次のコマンドを使用することです(しかし非常に遅い)。
awk "length<=300" *.log | wc -l
行数だけを取得するより良い方法はありますか?
答え1
awk
行数を計算するために使用されます。
awk 'length<=300{c++} END { print c }' *.log
どこ
c++
増分カウンタEND { print c }
最後の行以降に実行され、値が印刷されますc
。
わかりません。これはより速いでしょう(少なくともwc -l
行を計算して解析する必要はありません)。
小計のインポート(1行になる可能性があります)
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\}'
長さに基づいて行を一致させるには、検索パターンが1行に制限されているため、すべての文字に対してgrep(逆方向一致)を<=300
実行します。パターンは行の先頭に固定されています。一致する行数を計算します。-v
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)
シェルワイルドカードによって異なります。
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;'
正規表現で決定されるファイル(シェルワイルドカードとは無関係):
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