como suprimir o avanço de linha no awk
Enquanto estou conduzindo algum awkscript abaixo, mas ele gera muitos LFs indesejados . Gostaria de saber como suprimir (controlar) a saída LFdeste script. Agradecemos antecipadamente por seu conselho gentil.
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
O conteúdo do arquivo (arquivo) é algo como,
3,1
3,2
Neste caso, a saída é como
1,
1,
100
,
1,
0,
50
,
Isso é muito desajeitado. Minha saída desejada é como,
1,1,100
1,0,50
Respostas
$ 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
Melhor legível:
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
Você poderia tentar seguir, consertando a tentativa de OP aqui. Corrigido e testado em 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
Correções nas tentativas de OP:
- A
nfvariável removida não é necessária. - NÃO precisamos imprimir o mais rápido possível uma condição é satisfeita, é por isso que o problema está chegando na saída, em vez disso, podemos salvar os valores nos campos (por exemplo -> 1º e 2º campos) e imprimir a linha finalmente com a variável.
Explicação: Adicionando explicação detalhada acima.
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.
Você pode dizer AWKpara não colocar nova linha após cada printdefinindo ORScomo "", mas então você mesmo precisa colocar nova linha onde necessário. Seu código pode ser retrabalhado da seguinte maneira:
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
então para o fileconteúdo ser
3,1
3,2
vai gerar:
1,1,100
1,0,50
(testado no gawk 4.2.1)