3

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

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

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

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

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

4

2 回答 2

3

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

花括号的意思是“前面的许多模式”(如果您使用 --posix 或 --re-interval 调用 GNU awk)。

所以这个模式:

/^.{6}/

相当于这个:

/^....../

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

下面的 awk 命令会做类似的事情:

awk 'BEGIN{while(a++<30)s=s " "} {print substr($0, 1, 6) s substr($0, 7)}' myfile
于 2013-05-17T19:48:55.860 回答
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
于 2013-05-17T20:14:38.770 回答