scripting - print - awk unix
awk sin imprimir nueva lĂnea (5)
La variable ORS (separador de registros de salida) en AWK se establece de forma predeterminada en "/ 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.
Quiero que la suma / NR variable se imprima lado a lado en cada iteración. ¿Cómo evitamos que awk imprima newline en cada iteración? En mi código, una nueva línea se imprime 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
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 usa para imprimir una línea nueva
salida: 1 2 3 4 5
de una sola mano
awk ''/^/*/*/{gsub("*","");printf "/n"$0" ";next}{printf $0" "}'' to-plot.xls
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
lugar.
Supongo que muchas personas están entrando en esta pregunta buscando una forma 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 se resolvió!
En awk
, la print
inserta automáticamente un ORS
después de la impresión. ORS
significa "separador de registro de salida" y se predetermina a la nueva línea. Entonces, cuando diga print "hi"
imprime "hola" + nueva línea.
Esto se puede cambiar de dos maneras diferentes: usando un ORS
vacío o usando printf
.
Usando un ORS
vacío
awk -v ORS= ''1'' <<< "hello
man"
Esto devuelve "helloman", todos juntos.
El problema aquí es que no todos los awks aceptan configurar un ORS
vacío, por lo que probablemente tenga que configurar otro separador de registros.
awk -v ORS="-" ''{print ...}'' file
Por ejemplo:
awk -v ORS="-" ''1'' <<< "hello
man"
Devuelve "hello-man-".
Usando printf
(preferible)
Mientras que la print
agrega ORS
después del registro, printf
no lo hace. Por lo tanto, printf "hello"
simplemente imprime "hola", nada más.
$ awk ''BEGIN{print "hello"; print "bye"}''
hello
bye
$ awk ''BEGIN{printf "hello"; printf "bye"}''
hellobye
Por último, tenga en cuenta que, en general, se omite 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