我需要了解这个命令是如何工作的:
awk 'BEGIN{while(a++<30)s=s " "};{sub(/^.{6}/,"&" s)};l' myfile
我理解第一部分(BEGIN {}部分中的表达式)如何创建一个30个字符长的空格字符串。但是不明白第二部分(子)。
sub
将最近生成的字符串“s”添加到'myfile'的第6列。但是我看到命令的方式,搜索模式/^.{6}/
应该查找以一个字符(。)开头然后{6}的所有行,并用空格添加的字符串替换它们!
你能帮助我更好地理解这一点吗?
答案 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