cómo suprimir el salto de línea en awk

Dec 04 2020

Mientras estoy codificando un awkscript a continuación, pero genera muchos mensajes de correo electrónico no deseados LF. Me pregunto cómo suprimir (controlar) la salida de LFen 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

3 AkshayHegde Dec 04 2020 at 13:00
$ 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    
3 RavinderSingh13 Dec 04 2020 at 12:55

¿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 nfvariable 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.
Daweo Dec 04 2020 at 16:19

Puede indicarle AWKque no coloque una nueva línea después de cada uno printestableciendo ORSen "", 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 filecontenido siendo

3,1
3,2

saldrá:

1,1,100
1,0,50

(probado en gawk 4.2.1)