awk without printing newline

前端 未结 6 1379
失恋的感觉
失恋的感觉 2020-12-12 14:24

I want the variable sum/NR to be printed side-by-side in each iteration. How do we avoid awk from printing newline in each iteration ? In my code a newline is printed by def

相关标签:
6条回答
  • 2020-12-12 14:31

    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.

    0 讨论(0)
  • 2020-12-12 14:34

    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
    
    0 讨论(0)
  • 2020-12-12 14:39

    one way

    awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
    
    0 讨论(0)
  • 2020-12-12 14:48

    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.

    0 讨论(0)
  • 2020-12-12 14:51

    You can simply use ORS dynamically like this:

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

    0 讨论(0)
  • 2020-12-12 14:56

    If Perl is an option, here is a solution using fedorqui's example:

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

    Explanation:
    chomp removes the newline
    print "$_ " prints each line, appending a space
    the END{} block is used to print a newline

    output: 1 2 3 4 5

    0 讨论(0)
提交回复
热议问题