行を読み出し、行と行番号を出力するシェルプログラム

行を読み出し、行と行番号を出力するシェルプログラム

ファイルから行を読み取り、stdin行番号を使用して行を書き込むプログラムを作成する必要があります。stdout私はそれを使用できませんcat -n

テキストファイルに次の内容があるとします。

 abcdef
 ghi

 klm
 nopqr st

デフォルトでは、行を読み取って行を出力する必要がありますが、行番号も含まれます。

これは私の間の読み取りループですが、すべての行を印刷するわけではありません。

while read line
do
    awk '{print NR, $0}'

done < file

デフォルトでは、出力は次のようになります。

1 ghi
2 
3 klm
4 nopqr   st

何らかの理由でabcdef何も表示されず、数字2は空白にできません。

答え1

試してみましたか?nl -b a <file_name>

debian@virt00:~/test$ nl -b a file
     1  abcdef
     2   ghi
     3
     4   klm
     5   nopqr st
debian@virt00:~/test$
  • nl は垂直線を表します。
  • -b テキスト番号フラグ
  • 「a」はすべての行を表します。

より多くの情報を知りたい場合http://linux.die.net/man/1/nl

答え2

「cat -n」を使用できます。 「-n」フラグは、「cat」の出力行に数字を追加することです。

答え3

awk '$0!=""{print NR, $0}' file

空にすることを言います$0 != ""$0 not equalこの行の場合は、行番号と行番号を印刷してください。


これにより、次のような出力が生成されます。

1 abcdef
2 ghi
4 klm
5 nopqr st

前の行番号で。新しい行番号を含む出力が必要な場合:

awk '$0!=""{a++; print a, $0}' file

1 abcdef
2 ghi
3 klm
4 nopqr st

スクリプトのしくみを説明してください。

最初の行を読みますread line(印刷しない)。
次に、ファイルをawk他のすべての行にリンクして処理します。
awkは(デフォルトでは)空白行を削除しないため、空白行も印刷されます。

この問題を解決する方法はいくつかありますが、上記の方法が最も簡単なようです。

答え4

#!/bin/bash

awk '!/^$/{print ++a, $0}' file

echo

awk '!!$0{print ++a, $0}' file

echo

awk '{if ($0 != "") print ++aa, $0}' file

echo

NR=0
while read -r
do
    [[ "${REPLY}" = "" ]] || echo $((++NR)) "${REPLY}"
done < file

echo

関連情報