
ファイルから行を読み取り、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