awk without printing newline
Solution 1:
awk '{sum+=$3}; END {printf "%f",sum/NR}' ${file}_${f}_v1.xls >> to-plot-p.xls
print
will insert a newline by default. You dont want that to happen, hence use printf
instead.
Solution 2:
The ORS (output record separator) variable in AWK defaults to "\n" and is printed after every line. You can change it to " " in the BEGIN
section if you want everything printed consecutively.
Solution 3:
I guess many people are entering in this question looking for a way to avoid the new line in awk
. Thus, I am going to offer a solution to just that, since the answer to the specific context was already solved!
In awk
, print
automatically inserts a ORS
after printing. ORS
stands for "output record separator" and defaults to the new line. So whenever you say print "hi"
awk prints "hi" + new line.
This can be changed in two different ways: using an empty ORS
or using printf
.
Using an empty ORS
awk -v ORS= '1' <<< "hello
man"
This returns "helloman", all together.
The problem here is that not all awks accept setting an empty ORS
, so you probably have to set another record separator.
awk -v ORS="-" '{print ...}' file
For example:
awk -v ORS="-" '1' <<< "hello
man"
Returns "hello-man-".
Using printf
(preferable)
While print
attaches ORS
after the record, printf
does not. Thus, printf "hello"
just prints "hello", nothing else.
$ awk 'BEGIN{print "hello"; print "bye"}'
hello
bye
$ awk 'BEGIN{printf "hello"; printf "bye"}'
hellobye
Finally, note that in general this misses a final new line, so that the shell prompt will be in the same line as the last line of the output. To clean this, use END {print ""}
so a new line will be printed after all the processing.
$ seq 5 | awk '{printf "%s", $0}'
12345$
# ^ prompt here
$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
Solution 4:
one way
awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls