重新编号列表,但不更改顺序

重新编号列表,但不更改顺序

在 shell 脚本中,有没有办法只对列表重新编号,而不对列表中的内容重新编号?例如:

3. cat
1. hat
2. mouse

并将其更改为:

1. cat
2. hat
3. mouse

谢谢。

答案1

简单地:

awk '$1=NR "."'

这会将第一个字段(空格之前的第一个文本)更改为行(记录)号和一个点。由于记录号始终为正且大于 0,因此赋值结果将始终为 true,导致打印行(记录)时第一个字段发生更改。

当第一个字段发生更改时,将重新计算 NF(字段数)和零字段 ($0),将所有重复的空白转换为一个空格。

也就是说:具有多个相邻空格(和制表符)的行合并为一个空格。

如果需要从 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

相关内容