AWK - 如何改进这个例子?

时间:2012-04-22 19:08:43

标签: awk

我有一个文件:

AA
BB

此命令打印出来:

$ awk 'BEGIN { system("awk '"'"'{print}'"'"' file") }'

AA
BB

同样,但在'printf'中:

$ awk 'BEGIN { system("awk '"'"'{printf "%s ", $0}'"'"' file") }'

/bin/sh: Illegal option -,

如何改进最后一个命令以获得结果:

AA BB

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

希望你的问题仅仅是好奇心的练习。如果不是这样的话,毫无疑问会有更好的方法来完成你想要做的任何事情。

您可以使用变量来表示引号,而不是尝试使用打开和关闭单引号和双引号的复杂序列,如果它们未正确配对,可能会产生奇怪的副作用。通过实质上,第三级引用,它使代码更容易阅读。下面的技术有点类似于Perl的q()引用。

将变量q设置为单引号的八进制等值,然后就可以执行此操作:

awk 'BEGIN{q = "\047"; system("awk " q "{print}" q " file")}'

间距取决于您 - 每个字符串段连接到其相邻的段。

这是您可能会发现更具可读性的另一种方式:

awk 'BEGIN{q = "\047"; system("awk " q"{print}"q " file")}'

答案 1 :(得分:1)

这可能对您有用:

awk 'BEGIN{system("awk '\''{printf \"%s \", $0} END { print \"\" }'\'' file")}'
AA BB 

或更容易:

awk 'BEGIN{system("paste -sd\" \" file")}'
AA BB

答案 2 :(得分:0)

简单,不要使用awk;使用tr

tr '\n' ' ' file; echo;  

或者,如果您需要在一个管道中的所有内容

tr '\n' ' ' file | awk 'END { print }'

答案 3 :(得分:0)

如果你想纯粹用awk做,你可以尝试这样的事情:

awk '{printf "%s ", $0} END { print "" }'  <  aabb.txt