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

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

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

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

答え2

cut -d. -f2- input | nl -ba -w 1 -s .

これは入力から先行数字とピリオドを削除し、次のようにnlにパイプします。

  • -ba--各行の数
  • -w 1- 列を使用して挿入された番号を保存します。
  • -s .-.挿入された数字とテキストの区切り記号として使用されます。

サンプル入力:

3. cat
4. some words
1. hat
2. mouse
10. house
9. box
8. fox
7. here
6. there
5. anywhere

出力は次のとおりです

1. cat
2. some words
3. hat
4. mouse
5. house
6. box
7. fox
8. here
9. there
10. anywhere

関連情報