come sopprimere l'avanzamento riga in awk

Dec 04 2020

Mentre sto condendo alcuni awkscript di seguito, ma genera molti messaggi indesiderati LF. Mi chiedo come sopprimere (controllare) l'output di LFin questo script. Grazie in anticipo per il tuo gentile consiglio.

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

Il contenuto del file (file) è qualcosa del tipo,

3,1
3,2

In questo caso, l'output è come

1,
1,
100
,
1,
0,
50
,

Questo è molto maldestro. Il mio output desiderato è come,

1,1,100
1,0,50

Risposte

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

Migliore leggibilità:

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

Potresti per favore provare a seguire, risolvendo il tentativo di OP qui. Corretto e testato in 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

Correzioni nei tentativi di OP:

  • La nfvariabile rimossa non è necessaria.
  • NON abbiamo bisogno di stampare al più presto una condizione viene soddisfatta, ecco perché il problema sta arrivando in output, piuttosto possiamo salvare i valori nei campi (es. -> 1 ° e 2 ° campo) e stampare finalmente la riga con la variabile.

Spiegazione: aggiunta di una spiegazione dettagliata per quanto sopra.

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

Si potrebbe dire AWKdi non mettere a capo dopo ogni printimpostando ORSa "", ma poi è necessario mettere a capo da soli dove necessario. Il tuo codice potrebbe essere rielaborato in questo modo:

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

quindi per fileessere contenuto

3,1
3,2

produrrà:

1,1,100
1,0,50

(testato in gawk 4.2.1)