bugfix> bash > 投稿

ファイルに行番号を追加する方法はありますが、最後の空白行の後の行からのみ開始するようにしますか?例えば

aaa
bbb
ccc
ddd
eee

なるだろう

aaa
bbb
ccc
1. ddd
2. eee

ライン以来 ddd 最後の空白行の後の最初の行です。

今、私はファイルごとにvimを使用してこれを行うために(行を選択してクイックコマンドを実行することで)行っていますが、実行する必要があるファイルが1,000あり、個別に実行する必要はありません手、しかしそれを回避する方法を考えることができません。

回答 2 件
  • あなたはそれを簡単に行うことができます awk とを含む3つのルール END 行の最後のグループに番号を付けるルール。

    awk '
        NF > 0  { a[++n]=$0 }
        NF == 0 { for(i=1; i<=n; i++) print a[i]; print""; n=0 }
        END     { for(i=1; i<=n; i++) printf "%d. %s\n", i, a[i]}
    ' file
    
    

    説明

    最初のルールについて NF > 0 、少なくとも1つのフィールドがある場合(行が空でない場合)、その行を配列に格納します a およびプリインクリメントカウンター n (と一貫性を保つために awk 1 to NF インデックス作成)

    2番目のルール NF == 0 行が空白の場合は、保存した内容を出力します a 空の行を出力してリセットします n ゼロに;

    最後に、 END に格納されているすべての行のルール、番号、出力 a

    使用例/出力

    $ awk '
    >     NF > 0  { a[++n]=$0 }
    >     NF == 0 { for(i=1; i<=n; i++) print a[i]; print""; n=0 }
    >     END     { for(i=1; i<=n; i++) printf "%d. %s\n", i, a[i]}
    > ' file
    aaa
    bbb
    ccc
    1. ddd
    2. eee
    
    

  • ここに解決策があります awk

    awk '!NF{x=NR} {r[NR]=$0} 
         END {for (i=1;i<=NR;i++) print (i>x? (++n)". "r[i]: r[i])}' file
    
    

    行を配列に格納します。で ENDx は最後の空白の番号行になるため、次より大きい行番号の番号を出力します x

あなたの答え