行番号を印刷しますが、空行の行カウンタをリセットする方法は?

行番号を印刷しますが、空行の行カウンタをリセットする方法は?

以下を含むfile.txtがあります。

this is the first
second line
not last line

fourth but first
second in list
seventh in file
seventh with nl

通常、次のようにcatパイプします。|nl

$> cat file.txt | nl
1  this is the first
2  second line
3  not last line

4  fourth but first
5  second in list
6  seventh in file
7  seventh with nl 

ただし、空の行が表示された場合は、次のように行番号をリセットする必要があります。

$> alias_or_function file.txt
1  this is the first
2  second line
3  not last line

1  fourth but first
2  second in list
3  seventh in file
4  seventh with nl 

Express関数またはエイリアスを使用してこれをどのように実行できますか~/.zshrc

ベストアンサー1

空白行を\:\:新しいnlページ本文の先頭に置き換えることができます。

<your-file sed 's/^[[:space:]]*$/\\:\\:/' | nl

だから関数として:

number-lines-of-paragraphs() {
  sed -e 's/^[[:space:]]*$/\\:\\:/' -- "$@" | nl
}

(入力に、、も表示されている場合はnlヘッダー/本文/フッター区切り文字として理解されるため、通常は任意のテキストに行番号を追加するために使用することはできません。)\:\:\:\:\:\:nl

次の注意なしに同じ出力形式を取得することもできますawk

awk 'NF {printf "%6u\t%s\n", FNR, $0; next}; {FNR = 0; print}'

それとも他の人がここに投稿したもののいくつかのバリエーションです。

上記の数字は左パディング最大6文字の後にTAB文字が続きます。これはデフォルトのnl出力形式(defaultと%6u\t%s\n同じ)と同じですが、もちろんこの形式を必要に応じて調整できます。nl-s $'\t' -n rn -w 6

ただし、任意のファイル名を引数として取る関数にするには、文字を含むawkファイル名をブロックするという独自の注意に直面します。=なぜなら、その文字はawk変数の割り当てとして解釈されるからです(少なくとも最初の左側のコンテンツは=有効なawk変数名のように見えます。gawk次の方法を使用してこの問題を解決できます。

number-lines-of-paragraphs() {
  gawk -e '
    NF {printf "%6u\t%s\n", FNR, $0; next}
    {FNR = 0; print}' -E /dev/null "$@"
}

この関数が複数のファイルに渡されると、各ファイルの先頭で行番号がリセットされます。メソッドなど、すべてのファイルの内容をストリームにまとめて番号を付けるには、上記のようにsed | nl置き換えます。FNRNR

いずれにせよsed、現在のディレクトリから呼び出されたファイル(これを解決するために使用される)ではgawkなくstdinとして理解されます。--./-

おすすめ記事