come sopprimere l'avanzamento riga in awk
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
$ 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
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.
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)