如何替换和生成行号

如何替换和生成行号

我有一个包含以下数据的输入文件,如何将其转换为下面提到的输出文件。

输入文件

00001abc
00002def
00003ghi
00001jkl
00002mno
00003pqr
00001stu
00002vwx
00003yza
00004bcd

输出文件

00001abc
00002def
00003ghi
00004jkl
00005mno
00006pqr
00007stu
00008vwx
00009yza
00010bcd

答案1

另一种awk方法。

awk -F'[0-9]+' '{printf("%05d%s\n",NR,$2)}' infile >newfile

答案2

尝试

awk '{ printf "%05d%s\n",NR,substr($1,6)}' input_file > output_file

在哪里

  • printf "%05d" .. NR将输出行号(NR(记录数))并用 0 填充
  • substr($1,6)将提取$1(第一个参数)从 6 开始的子字符串

答案3

用于sed删除每行开头的现有数字,并nl以特定方式对行进行编号:

$ sed 's/^[0-9]*//' file | nl -n rz -s '' -w 5
00001abc
00002def
00003ghi
00004jkl
00005mno
00006pqr
00007stu
00008vwx
00009yza
00010bcd

这些nl选项要求使用零填充的数字(-n rz,这也使数字右对齐,但这在这里并不重要),行号和数据之间没有分隔符(-s '')。这些数字的宽度为五位数 ( -w 5)。

nl是一个 POSIX 实用程序

答案4

与什

while read a;do i=$((i+1));printf "%05d%s\n" $i "${a##*[0-9]}";done < infile > outfile

就地更换

printf '%s\n' $(while read a;do i=$((i+1));printf "%05d%s\n" $i "${a##*[0-9]}";done < infile) > infile

相关内容