cómo suprimir el salto de línea en awk
Mientras estoy codificando un awk
script a continuación, pero genera muchos mensajes de correo electrónico no deseados LF
. Me pregunto cómo suprimir (controlar) la salida de LF
en este script. Gracias de antemano por su amable consejo.
awk '
BEGIN{
FS=OFS=","
}
{
nf=NF
s=0 # initialization
if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
print s
print ","
}END{}' file
El contenido del archivo (archivo) es algo así como,
3,1
3,2
En este caso, la salida es como
1,
1,
100
,
1,
0,
50
,
Eso es muy torpe. Mi salida deseada es como,
1,1,100
1,0,50
Respuestas
$ cat input 3,1 3,2 $ awk 'BEGIN{FS=OFS=","}{c1=c2=sum=0;}$1==3{c1=1;sum+=50}$2==1{c2=1;sum+=50}{print c1,c2,sum}' input
1,1,100
1,0,50
Mejor legible:
awk 'BEGIN{
FS=OFS=","
}
{
c1=c2=sum=0; # reset variables
}
$1==3{ # if col1 equal to 3 then c1=1; sum+=50 } $2==1{ # if col2 equal to 1 then
c2=1;
sum+=50
}
{
print c1,c2,sum # print variables
}' input
¿Podría intentar seguir, arreglando el intento de OP aquí? Corregido y probado en GNU awk
.
awk '
BEGIN{
FS=OFS=","
}
{
s=0
if($1==3){s+=50;$1="1"} else{$1="0"} if($2==1){s+=50;$1="1"} else{$2="0"}
print $0,s
}' Input_file
Correcciones en los intentos de OP:
- La
nf
variable eliminada no es necesaria. - NO necesitamos imprimir lo antes posible si se cumple una condición, por eso el problema viene en la salida, sino que podemos guardar valores en los campos (por ejemplo, -> 1er y 2do campo) e imprimir la línea por fin con la variable.
Explicación: agregando una explicación detallada de lo anterior.
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS="," ##Setting FS and OFS as comma here.
}
{
s=0 ##Setting s as 0 here.
if($1==3){s+=50;$1="1"} else{$1="0"} ##Checking if 1st field is 3 then add 50 to s and set 1 to $1 else keep $1 as 0 here.
if($2==1){s+=50;$1="1"} else{$2="0"} ##Checking if 2nd field is 3 then add 50 to s and set 1 to $2 else keep $2 as 0 here. print $0,s ##Printing line and value of s here.
}' Input_file ##mentioning Input_file name here.
Puede indicarle AWK
que no coloque una nueva línea después de cada uno print
estableciendo ORS
en ""
, pero luego debe colocar una nueva línea usted mismo donde sea necesario. Su código se puede volver a trabajar de la siguiente manera:
awk '
BEGIN{
ORS="";FS=OFS=","
}
{
nf=NF
s=0 # initialization
if($1==3){print "1,"; s+=50}else{print "0,"} if($2==1){print "1,"; s+=50}else{print "0,"}
print s
print "\n"
}END{}' file
entonces por file
contenido siendo
3,1
3,2
saldrá:
1,1,100
1,0,50
(probado en gawk 4.2.1)