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

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

これはどのように達成できますか?

マニュアルに適用可能なオプションは表示されません。

1,000万行後にインデントが壊れるかを積極的に確認してみました。

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

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

このように多くの行を頻繁に生成することはありませんが、以前のように破損することは望ましくありません。これはどのように達成できますか?

答え1

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適切な設定を指定します。

答え2

seq 0 100000001000万行に拡張され、bash値を繰り返すためにメモリに保存する必要があります。それ問題は、システムのメモリ+スワップの両方を使用する前にそれを終了できたことです(最新のカーネルは終了するプロセスを正しく決定しますが、メモリが不足しているため、他のプロセスを終了したくありませんでした)。

nl入力を読み取るか、他のコマンドnlに置き換えて確認できます。catwc

bashmuruのバージョンは、すべてのデータを中間に保存する必要なしに同じでなければなりません。

編集:数字パディングに関するものであれば、マンページ10秒を読むとnl -w... Useオプションが出ると予想されますnl -w8。行番号と行内容の間の大きな間隔(デフォルトのタブを使用するため)が気に入らない場合は、マン-s' 'ページに追加して簡単に見つけることができます。質問にforループがある理由はまだ疑問に思います。

関連情報