como suprimir o avanço de linha no awk

Dec 04 2020

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

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

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

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

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)