理解AWK命令中使用的SUB

时间:2013-05-17 19:40:41

标签: awk substitution

我需要了解这个命令是如何工作的:

awk 'BEGIN{while(a++<30)s=s " "};{sub(/^.{6}/,"&" s)};l' myfile

我理解第一部分(BEGIN {}部分中的表达式)如何创建一个30个字符长的空格字符串。但是不明白第二部分(子)。

sub将最近生成的字符串“s”添加到'myfile'的第6列。但是我看到命令的方式,搜索模式/^.{6}/应该查找以一个字符(。)开头然后{6}的所有行,并用空格添加的字符串替换它们!

你能帮助我更好地理解这一点吗?

2 个答案:

答案 0 :(得分:3)

它与第6列无关,而且它不是在寻找文字{6}。

花括号表示“前面这么多模式”(如果用--posix或--re-interval调用GNU awk)。

所以这种模式:

/^.{6}/

等同于:

/^....../

它正在做的是在前6个字符之后添加字符串s,这可能是任何字符。

以下awk命令会执行类似的操作:

awk 'BEGIN{while(a++<30)s=s " "} {print substr($0, 1, 6) s substr($0, 7)}' myfile

答案 1 :(得分:2)

请参阅@ BillKarwin关于它正在做什么的答案,并参阅下面的第二个awk脚本以获得更简洁的方法:

$ cat file
abcdefghi

$ awk 'BEGIN{while(a++<30)s=s " "} {sub(/^.{6}/,"&" s)} 1' file
abcdef                              ghi

$ awk '{printf "%-36s%s\n",substr($0,1,6),substr($0,7)}' file
abcdef                              ghi