awk sin imprimir newline


Quiero que la variable sum/NR se imprima lado a lado en cada iteración. ¿Cómo evitamos que awk imprima una nueva línea en cada iteración ? En mi código se imprime una nueva línea por defecto en cada iteración

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

Quiero que la salida aparezca así

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

Mi salida actual es así

**cg_c**
ans1
ans2
ans3
**ep_c**
ans1
ans2
ans3
**is_c**
ans1
ans2
ans3
**tau**
ans1
ans2
ans3
**xhpl**
ans1
ans2
ans3
Author: Jacob Krall, 2010-01-07

5 answers

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

print insertará una nueva línea por defecto. No quieres que eso suceda, por lo tanto usa printf en su lugar.

 175
Author: CodeRain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 16:56:18

La variable ORS (output record separator) en AWK por defecto es "\n" y se imprime después de cada línea. Puede cambiarlo a "" en la sección BEGIN si desea que todo se imprima de forma consecutiva.

 67
Author: danben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 16:52:02

Supongo que muchas personas están entrando en esta pregunta buscando una manera de evitar la nueva línea en awk. Por lo tanto, voy a ofrecer una solución a eso, ya que la respuesta al contexto específico ya estaba resuelta.

En awk, print inserta automáticamente un ORS después de imprimir. ORS significa "separador de registros de salida" y por defecto la nueva línea. Así que cada vez que dices print "hi" awk imprime "hola" + nueva línea.

Esto se puede cambiar de dos maneras diferentes: usando un ORS vacío o usando printf.

Usando un ORS

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

Esto devuelve "helloman", todos juntos.

El problema aquí es que no todos los awks aceptan establecer un ORS vacío, por lo que probablemente tenga que establecer otro separador de registros.

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

Por ejemplo:

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

Devuelve "hello-man-".

Utilizando printf (preferible)

Mientras que print adjunta ORS después del registro, printf no lo hace. Por lo tanto, printf "hello" solo imprime "hola", nada else.

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

Finalmente, tenga en cuenta que, en general, esto pierde una nueva línea final, de modo que el indicador de shell estará en la misma línea que la última línea de la salida. Para limpiar esto, use END {print ""} para que se imprima una nueva línea después de todo el procesamiento.

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

$ seq 5 | awk '{printf "%s", $0} END {print ""}'
12345
 33
Author: fedorqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-01 09:49:48

Unidireccional

awk '/^\*\*/{gsub("*","");printf "\n"$0" ";next}{printf $0" "}' to-plot.xls
 5
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-07 17:17:07

Si Perl es una opción, aquí hay una solución usando el ejemplo de fedorqui:

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

Explicación:
chomp elimina la nueva línea
print "$_ " imprime cada línea, añadiendo un espacio
el bloque END{} se utiliza para imprimir una nueva línea

Salida: 1 2 3 4 5

 1
Author: Chris Koknat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 00:30:24