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バッファリングを無効にする) は 1 行を消費し、q終了前にその行を暗黙的に印刷して、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いつquit するかを指定します。

$ 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により、0 から始まります。

$ 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正規表現を使用して行番号を指定することができます。これは、長いリスト出力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}'

その代わり。

関連情報