nl:2行目の行番号を始めるには?

nl:2行目の行番号を始めるには?

これが標準出力ですls -ln | nl

wolf@linux:~$ ls -lh | nl
     1  total 24
     2  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     3  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     4  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

total 24開始番号の代わりに2行目の実際のファイル/ディレクトリから始めることはできますか?

希望の出力

wolf@linux:~$ ls -lh | nl
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py
wolf@linux:~$

答え1

残りと一緒に最初の行を使用し、残りを次の行に渡します。nl

$ ls -lh | { sed -u q; nl; }
total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

sed(バッファリングを無効にするために使用されます-u)ラインとquitを消費し、終了する前に暗黙的にラインを印刷します。nl残りのラインを消費します。

最初の行をインデントするには、次のようにします。

$ ls -lh | { sed -u 's/^/        /;q'; nl; }
        total 24
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

行番号付けをさらに開始するには、終了sed時点を教えてください。q

$ ls -alh | { sed -u 's/^/        /;3q'; nl; }
        total 24
        drwx------ 1 wolf wolf  186 Sep  24 22:18 .
        drwx------ 1 wolf wolf  186 Sep  24 22:18 ..
     1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
     2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
     3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

/\.\.$/q代わりに同様のものを使用することもできます3q

答え2

これはnlゼロから始まります。

$ ls -lh | nl -v 0
   0  total 24
   1  -rw-rw-r-- 1 wolf wolf  186 Sep  24 22:18 01.py
   2  -rw-rw-r-- 1 wolf wolf  585 Sep  24 22:21 02.py
   3  -rw-rw-r-- 1 wolf wolf  933 Sep  24 22:26 03.py

答え3

少し醜いですが、少なくともGNU Coreutilsの実装では、正規表現nlで番号を付ける行を指定できます。長いリスト出力で可能なファイル形式の1つでtはないからです。ls1あなたはできます

ls -lh | nl -bp'^[^t]'

残念ながら、これは出力ソートを維持しません。

おそらく最も正式に正しい方法は、ls出力を別々のヘッダーと本文部分に分割することです。

$ ls -lh | sed -e '1s/.*/\\:\\:\\:\n&\n\\:\\:/' | nl

       total 0

     1  -rw-rw-rw- 1 steeldriver steeldriver   0 Sep  9 19:53 bar
     2  -rw-r--r-- 1 steeldriver steeldriver 449 Sep 16 17:41 bash_envs
     3  -rw-rw-rw- 1 steeldriver steeldriver 131 Sep  5 18:13 dirlist
     4  -rw-r--r-- 1 steeldriver steeldriver 359 Sep 13 19:42 error_status

(基本的にタイトル番号付けスタイルは次のとおりです。まったく)。

答え4

awk代わりに、次のことを試すことができます。

ls -lh | awk '{printf("%5s  ",NR==1?" ":NR-1); print}'

これにより、番号付けされていない「フル」行が印刷され、フィールド幅が5の数字を含む残りのすべての行が右に調整されて印刷されます。数字と行の内容の間のスペースは2つのスペースです(フォーマット5s文字列の次のテキスト)printf()\t

「合計」行が必要ない場合は、次のものを使用できます。

ls -lh | awk 'NR>1{print (NR-1) "\t" $0}'

または

ls -lh | awk 'NR>1 {printf("%5s  ",NR-1); print}'

代わりに。

関連情報