ChatGPT解决这个技术问题 Extra ChatGPT

awk 不打印换行符

我希望在每次迭代中并排打印变量 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

我希望输出看起来像这样

cg_c ans1  ans2  ans3  
ep_c ans1  ans2  ans3 
is_c ans1  ans2  ans3
tau  ans1  ans2  ans3 
xhpl ans1  ans2  ans3

我目前的输出是这样的

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3

C
CodeRain

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

print 默认插入换行符。您不希望这种情况发生,因此请改用 printf


但请注意 printf 会解释 %s,因此请使用 printf "%s" whatever 而不是 printf whatever
printf "%s",whatever 您忘记了逗号。您还可以扩展更多变量并用逗号分隔它们。
d
danben

AWK 中的 ORS(输出记录分隔符)变量默认为“\n”,并在每一行之后打印。如果您希望连续打印所有内容,可以在 BEGIN 部分将其更改为“”。


您甚至可能希望将其设置为 ""(无空格)以完全没有分隔。
像这样:awk 'BEGIN {ORS="\t"} {sum+=$3}; END {print sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
或者 ORS="\r" 如果您想打印一个显示进度的计数器。
f
fedorqui

我想很多人都在进入这个问题,寻找一种方法来避免 awk 中的新行。因此,我将为此提供一个解决方案,因为特定上下文的答案已经解决了!

awk 中,print 在打印后自动插入 ORSORS 代表“输出记录分隔符”,默认为新行。因此,每当您说 print "hi" 时,awk 都会打印“hi”+ 换行符。

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

使用空 ORS

awk -v ORS= '1' <<< "hello
man"

这将返回“helloman”,所有这些。

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

awk -v ORS="-" '{print ...}' file

例如:

awk -v ORS="-" '1' <<< "hello
man"

返回“hello-man-”。

使用 printf (首选)

print 在记录后附加 ORS,而 printf 没有。因此,printf "hello" 只打印“hello”,没有别的。

$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye

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

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

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345

g
ghostdog74

单程

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

小提示:永远不要使用 printf $0,因为 $0 可能包含 %F 等字符串......以下很容易失败(至少在 GAWK 3.1.5 中):echo "%F"|awk '{printf $0}'。请改用 printf "%s",$0
t
ttulka

您可以像这样简单地动态使用 ORS:

awk '{ORS="" ; print($1" "$2" "$3" "$4" "$5" "); ORS="\n"; print($6-=2*$6)}' file_in > file_out


酷,用它来获取Kubernetes集群上一行节点的IP地址。 k get nodes -o wide --no-headers | awk '{ORS=" "; print $6 }'
C
Chris Koknat

如果 Perl 是一个选项,这里是使用 fedorqui 示例的解决方案:

seq 5 | perl -ne 'chomp; print "$_ "; END{print "\n"}'

说明:
chomp 删除换行符
print "$_ " 打印每一行,附加一个空格
END{} 块用于打印换行符

输出:1 2 3 4 5


R
RARE Kpop Manifesto

这是无需 printfENDawk 方式(假设您的输入小于 500 MB):

序列 199 | mawk NF=NF RS='^$' FS='\n' OFS=

123456789101112131415161718192021222324252627282930313233343
536373839404142434445464748495051525354555657585960616263646
566676869707172737475767778798081828384858687888990919293949
596979899100101102103104105106107108109110111112113114115116
117118119120121122123124125126127128129130131132133134135136
137138139140141142143144145146147148149150151152153154155156
157158159160161162163164165166167168169170171172173174175176
177178179180181182183184185186187188189190191192193194195196
197198199

(为便于阅读重新格式化 - 它是一行,末尾有 \n

如果您只是想在两者之间放置一个空格:

序列 19 | mawk 'NF && --NF' RS='^$' FS='\n'

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

如果您不介意 1 个额外的尾随空格,那么它会更简单

mawk NF=NF RS='^$' FS='\n'