假设我在文件名Details.txt中有以下数据:
0154 Raghav Sharma 26 Indore
0159 rakh patid 24 Pune
0159 rakh patid 24 Pune
0018 sai kanak 28 mumbai
0159 rakh patid Pune
0159 sarak jatid Pune
现在我已经应用了以下awk命令来生成4位数序列号:
awk 'BEGIN{a=1;OFS=" "}/^/{$1=sprintf("%04d",a);++a;print $0; next;}{print $0}' Details.txt
输出:
0001 0154 Raghav Sharma 26 Indore
0002 0159 rakh patid 24 Pune
0003 0159 rakh patid 24 Pune
0004 0018 sai kanak 28 mumbai
0005 0159 rakh patid Pune
0006 0159 sarak jatid Pune
最后两行的格式被打扰了。请建议一种方式,这样 可以保持正确的格式以及正确的序列。
答案 0 :(得分:4)
你想避免重新计算$ 0;如果这样做,多个空格将压缩到一个空格:
$ cat Details.txt
0154 Raghav Sharma 26 Indore
0159 rakh patid 24 Pune
0159 rakh patid 24 Pune
0018 sai kanak 28 mumbai
0159 rakh patid Pune
0159 sarak jatid Pune
$ gawk '{printf "%04d %s\n", NR, $0}' Details.txt
0001 0154 Raghav Sharma 26 Indore
0002 0159 rakh patid 24 Pune
0003 0159 rakh patid 24 Pune
0004 0018 sai kanak 28 mumbai
0005 0159 rakh patid Pune
0006 0159 sarak jatid Pune
答案 1 :(得分:2)
$ # nl command is more apt for numbering files
$ nl -s' ' --number-format=rz -w4 ip.txt
0001 0154 Raghav Sharma 26 Indore
0002 0159 rakh patid 24 Pune
0003 0159 rakh patid 24 Pune
0004 0018 sai kanak 28 mumbai
0005 0159 rakh patid Pune
0006 0159 sarak jatid Pune
$ # with awk, leaving this as an alternate to printf solution
$ awk '{sub(/^/, sprintf("%04d ",++c))} 1' ip.txt
0001 0154 Raghav Sharma 26 Indore
0002 0159 rakh patid 24 Pune
0003 0159 rakh patid 24 Pune
0004 0018 sai kanak 28 mumbai
0005 0159 rakh patid Pune
0006 0159 sarak jatid Pune
sub
在行首插入文字
$1
将强制$0
使用OFS
重新对齐,而sub
将保留其余内容gawk
sprintf("%04d ",++c))
默认情况下,未初始化的变量在数字上下文中为0
(或者只使用NR
,如其他答案所示)1
以惯用方式打印$0