没有打印换行符的awk

Sha*_*dra 155 scripting awk newline

我希望在每次迭代中并排打印变量sum/NR.我们如何避免awk在每次迭代中打印换行符?在我的代码中,默认情况下会在每次迭代中打印换行符

for file in cg_c ep_c is_c tau xhpl
printf "\n $file" >> to-plot.xls
    for f in 2.54 1.60 800 
        awk '{sum+=$3}; END  {print  sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
    done
done
Run Code Online (Sandbox Code Playgroud)

我希望输出看起来像这样

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3
Run Code Online (Sandbox Code Playgroud)

我目前的出局是这样的

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
Run Code Online (Sandbox Code Playgroud)

Cod*_*ain 202

awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls

print将默认插入换行符.你不希望这种情况发生,因此使用printf.

  • 但请记住`printf`解释`%s`所以使用`printf"%s"what`而不是`printf whatever`. (4认同)
  • `printf "%s",whatever` 你忘了逗号。您还可以扩展更多变量并用逗号分隔它们。 (2认同)

dan*_*ben 71

AWK中的ORS(输出记录分隔符)变量默认为"\n",并在每行后打印.BEGIN如果您想要连续打印所有内容,可以在该部分中将其更改为"" .

  • 像这样:'awk'BEGIN {ORS ="\ t"} {sum + = $ 3}; END {print sum/NR}'$ {file} _ $ {f} _v1.xls >> to-plot-p.xls` (7认同)
  • 你甚至可能想把它设置为"""(没有空格),根本没有分离. (6认同)
  • 或者`ORS ="\ r"`如果你想打印一个显示进展的计数器. (2认同)

fed*_*qui 40

我想很多人都在进入这个问题,寻找避免新线路的方法awk.因此,我将提供一个解决方案,因为特定背景的答案已经解决了!

awk,print自动插入ORS后打印.ORS代表"输出记录分隔符",默认为新行.所以每当你说print "hi"awk打印"hi"+新行.

这可以通过两种不同的方式进行更改:使用空ORS或使用printf.

用空了 ORS

awk -v ORS= '1' <<< "hello
man"
Run Code Online (Sandbox Code Playgroud)

这将一起返回"helloman".

这里的问题是并非所有awks都接受设置为空ORS,因此您可能必须设置另一个记录分隔符.

awk -v ORS="-" '{print ...}' file
Run Code Online (Sandbox Code Playgroud)

例如:

awk -v ORS="-" '1' <<< "hello
man"
Run Code Online (Sandbox Code Playgroud)

返回"hello-man-".

使用printf(优选)

虽然print高度ORS纪录后,printf没有.因此,printf "hello"只打印"你好",没有别的.

$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye
Run Code Online (Sandbox Code Playgroud)

最后,请注意,通常这会错过最后一个新行,因此shell提示符将与输出的最后一行位于同一行.要清除它,请使用,END {print ""}以便在所有处理后打印新行.

$ seq 5 | awk '{printf "%s", $0}'
12345$
#    ^ prompt here

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 5

单程

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
Run Code Online (Sandbox Code Playgroud)

  • 小注意事项:永远不要使用 `printf $0`,因为 `$0` 可能包含像 `%F` 等字符串...以下很容易失败(至少对于 GAWK 3.1.5): `echo "%F"|awk '{ printf $0}'`。请改用 `printf "%s",$0`。 (2认同)