私は巨大なファイル(数ギガバイトなど)を持っていて、さまざまなツール(分割など)を試しましたが、必要に応じてこれをawkで実行する必要があります。
基本的にawkの機能をエミュレートしたいと思いますsplit -b 1 file
(提供されたマニュアルページとコマンドで判断するとファイルをバイトごとに1バイトに分割します)。
また、生成されたファイルのファイル名(増分)がスクリプトの実行中にstdoutに印刷され、主に他のスクリプトなどで変数として使用できるようにしたいです。
編集:これまで私がしたことは次のとおりです。
awk '{for(i=1;i<=length;i++) print substr($0, i, 1)}' filename
ファイル名の詳細
他のファイルを上書きしたくない場合は、ファイル名を増やす必要があります。 (数字または英数字)。
比較のために、split
coreutilsのツールは次のように文字を使用してファイル名を生成します。xa xb...xaa
私は次のいずれかが欲しい。または、可能であれば数字のみが必要です:1 2..444
または/および英数字ファイル名:a1 a2
ベストアンサー1
GNUを使用すると、awk
次のことができます。
LC_ALL=C gawk -v RS='.{1}' '
{
file = "filename" ++n
print file
printf "%s", RT > file
close(file)
}' < input
ただし、ほとんどのファイルシステムでバイトごとに1つのファイルを作成することを考慮すると、ディスク容量(ほとんどのファイルシステムでは1バイトのファイルがまだ数KBのディスク容量を占めるため)やinodeがすぐに不足する可能性があります。そうしないと、パフォーマンスが非常に悪くなる可能性があります。数十万バイトの入力
LC_ALL=C
.
文字の代わりにバイトを一致させるために使用されます。RS='.{1}'
レコード区切り文字を1
単一文字(で囲まれた単一バイトLC_ALL=C
)に設定します。RS=.
レコード区切り文字はドット文字であるため、機能しません。正規表現と見なすにはRS
複数の文字が必要です。また動作しますが、テストの結果、3つのうち、これが最も効果的であることがわかりました。gawk
(.)
.|.
.{1}
RT
一致するテキストが含まれていますRS
。
RS
正規表現としてバイナリデータを処理でき、RT
非標準拡張です。RT
AFAIK GNU専用です。