我可以在不插入换行符的情况下进行多个awk操作吗?

时间:2016-09-03 22:57:40

标签: bash awk

我是一个非常小且具体需求的新手。我正在使用awk解析一些东西,我需要从原始文本中的几个部分生成不间断的文本行。 但只要我使用分号,awk就会在输出中插入换行符。

我的意思最简单的例子:

原文:

1 2

awk命令:

{ print $1; print $2 }

输出将是:

1
2

问题是我需要输出为单行,我还需要使用分号,因为我必须对原始文本执行多个操作,而不是所有操作 print

另外,使用ORS =“”会导致很多不同的问题,所以它不是一个选项。

在没有新行插入的情况下,我可以在同一行中进行多项操作吗?

谢谢!

5 个答案:

答案 0 :(得分:5)

输出中的换行符与您使用分号分隔脚本中的语句无关,它们是因为print输出您给出的参数,后跟ORS的内容和默认值ORS的值是换行符。

您可能需要以下任何一种版本:

$ echo '1 2' | awk '{printf "%s ", $1; printf "%s ", $2; print ""}'
1 2 
$

$ echo '1 2' | awk -v ORS=' ' '{print $1; print $2; print "\n"}'
1 2
 $

$ echo '1 2' | awk -v ORS= '{print $1; print " "; print $2; print "\n"}'
1 2
$

但如果不了解更多关于你正在尝试做什么的话,很难说。

至少要仔细阅读Arnold Robbins编写的有效Awk编程第4版,以便在尝试使用awk编程之前了解基础知识,否则你将浪费大量时间并学到很多东西首先是坏习惯。

答案 1 :(得分:0)

如果使用printf,例如

,您可以更好地控制输出
awk '{ printf "%s %s\n",$1,$2 }'

答案 2 :(得分:0)

awk '{print $1 $2}'

这种情况下的解决方案是

答案 3 :(得分:0)

TL; DR

您收到换行符是因为print在每个print语句后将 OFS 发送到标准输出。您可以通过各种其他方式格式化输出,但关键是通常只调用单个printprintf语句,无论您要打印多少字段或值。

使用逗号

执行此操作的一种方法是使用逗号分隔参数,对print使用一次调用。这将在打印的参数之间插入OFS。例如:

$ echo '1 2' | awk '{print $1, $2}'
1 2

不要分隔参数

如果您不希望输出中出现任何分隔,只需将所有参数传递给单个print语句即可。例如:

$ echo '1 2' | awk '{print $1 $2}' 
12

格式化字符串

如果您想要更多控制,请使用printf格式化字符串。例如:

$ echo '1 2' | awk '{printf "%s...%s\n", $1, $2}' 
1...2

答案 4 :(得分:0)

$ echo "1 2" | awk '{print $1 " " $2}'
1 2