順序を変更せずにリスト番号を変更する

順序を変更せずにリスト番号を変更する

シェルスクリプトでリストの内容の番号を変更するのではなく、リストの番号だけを変更する方法はありますか?たとえば、

3. cat
1. hat
2. mouse

次のように変更します。

1. cat
2. hat
3. mouse

ありがとうございます。

ベストアンサー1

簡単に:

awk '$1=NR "."'

これにより、最初のフィールド(スペースの前の最初のテキスト)が行(レコード)番号と点に変わります。レコード番号は常に正で0より大きいため、割り当て結果は常にtrueになり、行(レコード)が印刷されると最初のフィールドが変更されます。

最初のフィールドが変更されると、NF(フィールド数)とゼロフィールド($ 0)が再計算され、繰り返されるすべてのスペースを1つのスペースに変換します。

つまり、複数の隣接する空白(およびタブ)を含む行が単一の空白にマージされます。

awk処理で複数のスペースを回収する必要がある場合は、より複雑になります(GNU awkにのみpatsplitがあります)。

awk '{
       n=patsplit($0,f,/[^ \t\n]+/,s);   # split the line storing whitespace.
       f[1] = NR "."                     # only change actually needed.
       for(i=0;i<=n;i++)                 # for all fields (and separators)
       {  
          printf("%s%s",f[i],s[i])       # print each field and separator.
       }
       print("")                         # cause the printing of an OFS
     }
    ' patsplitfile

おすすめ記事