Awk - 生成されたファイル名を標準出力として指定しながら、各バイトを独自のファイルに分割します。

Awk - 生成されたファイル名を標準出力として指定しながら、各バイトを独自のファイルに分割します。

私は巨大なファイル(数ギガバイトなど)を持っていて、さまざまなツール(分割など)を試しましたが、必要に応じてこれをawkで実行する必要があります。

基本的にawkの機能をエミュレートしたいと思いますsplit -b 1 file(提供されたマニュアルページとコマンドで判断するとファイルをバイトごとに1バイトに分割します)。

また、生成されたファイルのファイル名(増分)がスクリプトの実行中にstdoutに印刷され、主に他のスクリプトなどで変数として使用できるようにしたいです。

編集:これまで私がしたことは次のとおりです。

awk '{for(i=1;i<=length;i++) print substr($0, i, 1)}' filename

ファイル名の詳細

他のファイルを上書きしたくない場合は、ファイル名を増やす必要があります。 (数字または英数字)。

比較のために、splitcoreutilsのツールは次のように文字を使用してファイル名を生成します。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非標準拡張です。RTAFAIK GNU専用です。

おすすめ記事