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
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.
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.
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
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
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íneaprint "$_ "
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
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