如何使用awk将序列添加到任何输入文件?

时间:2018-04-24 11:44:05

标签: awk sequence

假设我在文件名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

最后两行的格式被打扰了。请建议一种方式,这样 可以保持正确的格式以及正确的序列。

2 个答案:

答案 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
    • ,请使用Processing Fixed-Width Data using FIELDWIDTHS
  • sprintf("%04d ",++c))默认情况下,未初始化的变量在数字上下文中为0(或者只使用NR,如其他答案所示)
  • 1以惯用方式打印$0
  • 的内容