como suprimir o avanço de linha no awk
Enquanto estou conduzindo algum awk
script abaixo, mas ele gera muitos LF
s indesejados . Gostaria de saber como suprimir (controlar) a saída LF
deste 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
nf
variá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 AWK
para não colocar nova linha após cada print
definindo ORS
como ""
, 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 file
conteúdo ser
3,1
3,2
vai gerar:
1,1,100
1,0,50
(testado no gawk 4.2.1)