複数の大きなファイルのそれぞれの行数を出力するスクリプトを作成するのに役立ちます。時間がかかるため、一致するすべてのファイルの最後の行番号を表示するコマンドをwc -l
使用したいと思います。awk
abd*2020-09-21*
ls -l abd*2020-09-21*
22個の長い(大)ファイルを表示中wc -l
各ファイルの結果を見つける必要があります。- 現在私が使用している
しかし、これは非常に時間がかかります。改善に役立つ必要があります。wc -l abd*2020-09-21.txt > CCNC_UNIX_COUNTS.txt
頑張った
sed -n '$='
matchinvはすべてのファイルに対してループで動作abd*2020-09-21.txt
し、結果をファイルに出力する必要があります。CCNC_UNIX_COUNTS
答え1
テキストファイルは、インデックスやメタデータを持たないバイトストリームであり、各行の後に改行文字が続く行です。ファイル全体を読む以外に、行数を数える他の方法はありません。wc -l
これは、改行バイトを読み取るバッチスキャン以外に他の操作を実行する必要がないため、効率的に実行できます。一方、awk
見てみる他のツールもたくさんあります。コンテンツフィールド分割の実行と同じ行では、実行のために提供したコードを解釈して実行する必要があります。wc -l
これより速いスクリプト言語はありません。
一方、メタデータの欠落が通常問題である場合は、他のファイル形式(SQLiteデータベースなど)を使用することがオプションかもしれません。もちろん、これにより、一般的なテキスト処理ツールを使用してデータを操作することはできませんが、ランダムアクセスが容易になります。または、すべての行を保持するようにデータパスを変更できる場合一定の長さ、ランダムアクセスと行の計算は簡単です(ただし、途中で行を挿入または削除しません)。
答え2
数が正確である必要がない場合は、ファイルの末尾からサンプリングして平均を取得し、非常に高速な統計で得られたファイルのバイト長に基づいて行数を計算して長さを推定できます。 。
たとえば、/ tmpに100MBのファイルがあります。使用:
time wc -l /tmp/100-mb.txt
生産する:
1777700 /tmp/100-mb.txt
real 0m0.075s
推定には Perl コードを使用します。
time ./esmele /tmp/100-mb.txt
生産する:
1763385
real 0m0.012s
精度は99%以上で、速度は6倍向上します。 Perl 変換が省略されるため、C または類似のコードがより高速になる可能性があります。
システムで実行:
OS, ker|rel, machine: Linux, 3.16.0-10-amd64, x86_64
Distribution : Debian 8.11 (jessie)
perl 5.20.2
頑張って...乾杯、drl
答え3
ハードウェアによっては、次のことを試すことができます。
expr-fi/fastlwc: SIMD強化ワードカウンター - GitHub
マルチスレッドバージョンもあります。
大容量ファイルでテストしたことはありませんが、うまくいきますはい早く。
SIMDによる単語計算アルゴリズムはreadmeファイルに記載されています。基本的なアイデアは次のとおりです。
Just a sample (multiple spaces).
1111010111111011111111100011111111 =[1]
0111101011111101111111110001111111 SHIFT [1] =[2]
1000010100000010000000001110000000 NOT [2] =[3]
1000010100000010000000000010000000 [1] AND [3]
fastwc
単語と行は計算されますが、マルチバイト文字は計算されません。