web-dev-qa-db-ja.com

番号付けの前にすべての入力を吸収する `nl`呼び出し

これはどのように行うことができますか?

マニュアルに該当するオプションがありません。

1000万行後にインデントが壊れることを積極的に確認しました。

次のように確認できます。

$ (for i in `seq 0 10000000`; do echo "$i"; done) | nl

それほど多くの行を生成することはあまりありませんが、そのように途切れたくありません。これはどのように行うことができますか?

1
41754

nlが入力全体をバッファリングして、必要な最大数を測定することを提案している場合、これはストリームフィルタの精神ではまったくありません。まれな例外(たとえば、sort)を除いて、コアユーティリティはストリームをすぐに処理しようとします。特に、実質的に無限のパイプラインで使用される可能性があるためです(たとえば、nlそしてファイルにリダイレクトされると、かなりの量のデータが蓄積される可能性があります)。

パディングを処理する標準的な方法は、予想される最大幅をパラメーターとして指定することです。この場合、パディングをオフにするか(とにかくこれを好みます。前面にスペースで区切られた列を配置するのが理にかなっています)、別の幅を設定することができます。比較:

seq 0 10000000 | nl -w12 # default right-justify, 12 character width

seq 0 10000000 | nl -w1 # default right-justify, 1 character width (no padding)

seq 0 10000000 | nl -w1 -s' ' # right-justify, space delimited instead of tab

seq 0 10000000 | nl -nln # left-justify

本当にこれを自動的に実行したい場合は、wc -lを使用して最初に長さを測定し、次に-wを適切に設定します。

4
orion

seq 0 10000000は1,000万行と1行に拡張されており、値をループできるようにbashはメモリに保存する必要があります。 Thatが壊れているので、システムのすべてのメモリとスワップを使い果たす前に、なんとか終了しました(最近のカーネルでは、メモリ不足で他のプロセスを強制終了したくありませんでした)どのプロセスを強制終了するかを正しく決定します)。

nlnlまたはcatに置き換えるか、入力を読み取るその他のコマンドを使用して、wcではないことを確認できます。

muruのバージョンは、すべてのデータを中間に格納するためにbashを必要とせずに同等である必要があります。

編集:それが数字のパディングに関するものである場合、マンページを10秒間読み取ると、nl -wオプションが表示されると予想していました...nl -w8を使用してください。 (デフォルトのタブが使用されているために)行番号と行の内容の間の大きなギャップに満足できない場合は、-s' ';を追加できます。それはすべてマンページにあり、簡単に見つけることができます。しかし、なぜ質問のforループなのか疑問に思っています。

1
wurtel