今、カットに行の長さ制限がありますか?

今、カットに行の長さ制限がありますか?

25,000文字を使用するスクリプトがあり、その中に「カット」を使用します。

...\n" | cut -c -$LENGTH

よく使わないけど効果がありました(あ、約1~2年前)。もちろん、私のシステム管理者がいくつかのアップデートを実行したかもしれませんが、デフォルトのユーティリティ変更はもはや起こらないようです。私が間違っているようです。

これでエラーが発生します。

cut: [-bcf] list: 3080 too large (allowed 1-2048)

...私の端末にはフルテキスト/文字ページもありません。

大きなテキストの塊からランダムな塊をインポートできるPOSIXユーティリティはありますか?それともawk / sed / perlを使用する必要がありますか?そして、定期的に使用しないたびに交換することを心配していますか?


オープンBSD 6.4

切断可能なバージョンはありません。その男はこう言いました。

カットユーティリティはIEEE Std 1003.1-2008(「POSIX.1」)仕様に準拠しています。

OpenBSD 6.4 2016年10月24日 OpenBSD 6.4

ベストアンサー1

IEEE Std 1003.1-2008(「POSIX.1」)仕様に準拠しています。

この仕様のcut(そしてそれ以上)が言った:

入力ファイルはテキストファイルでなければなりませんが、行の長さは制限されません。

次の定義テキストファイル:

ゼロ行以上の文字を含むファイル。この行には NUL 文字は含まれておらず、{LINE_MAX}<newline> 文字を含め、どの行もバイトより長くすることはできません。 [… ]

~について{LINE_MAX}:

{LINE_MAX}
特に明記しない限り、ユーティリティがテキストファイルを処理するように説明されている場合、ユーティリティ入力行(標準入力または他のファイル)の最大長(バイト単位)です。長さには末尾の <newline> スペースが含まれます。
最小許容値:{_POSIX2_LINE_MAX}

{_POSIX2_LINE_MAX}
特に明記しない限り、ユーティリティがテキストファイルを処理するように説明されている場合、ユーティリティ入力行(標準入力または他のファイル)の最大長(バイト単位)です。長さには末尾の <newline> スペースが含まれます。
値:2048

任意の長さの行を拒否してはいけないように見えますが、それでもORにcut制限がないという意味ではありません。観察された制約は、(家庭)または(固定)によって引き起こされる可能性が高いです(参照-c-ballowed 1-2048{LINE_MAX}{_POSIX2_LINE_MAX}このコメント)。

一般的に言えば、{_POSIX2_LINE_MAX}安全な値でなければなりません。{LINE_MAX}おそらくより大きいかもしれませんが、少なくとも{_POSIX2_LINE_MAX}2048年です。

次のいずれかを比較してください。はい:

POSIX.1-2008このボリュームのほとんどのユーティリティはテキストファイルで機能します。 Cutユーティリティを使用すると、任意の行長のファイルを同じデータを含むテキストファイルセットに変換できます。貼り付けユーティリティを使用すると、任意の行長でファイルを作成または再作成できます。たとえば、ファイルに長い行が含まれている場合:

cut -b 1-500 -n file > file1
cut -b 501- -n file > file2

file1500バイト(+ <newline>を含む)以下の行で(テキストファイル)を生成し、file2ファイルの残りのデータを含めます。 (file2ファイルの行がバイトより長い場合はテキストファイルではありません。)500 + {LINE_MAX}元のファイルは、次のように再作成できます。file1file2

paste -d "\0" file1 file2 > file

これは、「より大きなテキストブロックから任意のブロックを取得する」POSIX方式を提供します。必要な合計を取得するのに必要なだけ、各行の先頭で2048以下のバイトを切り取ります。たとえば、1行に3080バイトが必要な場合は、最初に2000バイトを取り出し、残りの1080バイトを取り出すことができます。

cut -b 1-2000 file > file1              # first 2000 bytes
cut -b 2001- file > file2               # remainder
cut -b 1-1080 file2 > file3             # following 1080 bytes
paste -d "\0" file1 file3 > file_final  # desired 3080 bytes (or less) per line

正確に2048バイトの場合、cut改行文字を追加した結果行は2048バイトを超える可能性があり(文書を正しく解釈した場合)、テキストファイルと見なされない可能性があります。したがって、万が一に備えて最大2047を使用します。

おすすめ記事