長さ条件を使用して行数を計算する

長さ条件を使用して行数を計算する

行長が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実行します。パターンは行の先頭に固定されています。一致する行数を計算します。-v301grep^-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です。ここで、パイプは少量のデータ、数値、ファイル名にのみ使用されます。catgrep

答え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

関連情報