Como faço para percorrer um arquivo com o awk

1

Estou usando este comando sed -e '/^*/d' $WORKFILE | awk -f test.awk >> $OUTPUTFILE em um script ksh para pegar um arquivo de 274567 linhas como essa

*
*
*
*
*
 syopsf00
         a0000096
                 782            1
         CAStmtInv
 syopsf00
         a0000096
                 782            1
         USStmtInv
 syopsf00
         a0000096
                 606            1
         CAStmtInv
 syopsf00
         a0000096
                 606            1
         USStmtInv
 syopsf00
         a0000096
               23472            4
         AO
 syopsf00
         a0000096
               23472            4
         Dealer
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*

e produz um arquivo com linhas como esta

syopsf00 a0000096 782 1 CAStmtInv
syopsf00 a0000096 782 1 USStmtInv
syopsf00 a0000096 606 1 CAStmtInv
syopsf00 a0000096 606 1 USStmtInv

mas tudo que consigo é isso

syopsf00 a0000096 782 1 CAStmtInv

é assim que o script awk (test.awk) se parece

BEGIN {
         RS="\n\n";
         FS=" ";

}
END {
         print $1,$2,$3,$4,$5;
}
    
por terry 20.01.2015 / 22:37

3 respostas

1

Embora (dada a sua opinião) não esteja muito claro o que você está tentando fazer na íntegra, o problema com a saída é que somente a última linha alimentada no awk será impressa devido ao fato de você colocar a impressão a instrução END.

Deveria ser assim:

BEGIN { 
  RS="\n\n"; FS=" ";
}
{ 
  print $1,$2,$3,$4,$5; 
}

Nota: o recuo é apenas minha preferência pessoal.

    
por 20.01.2015 / 22:48
0

Espero que o único awk seja suficiente

awk '
     /syopsf00/{print ""}
     !/^[*]/{printf "%s",$0}
     END{print ""}
    ' $WORKFILE >> $OUTPUTFILE

Ou se você quiser remover multi-espaços e usar awk-scriptfile:

awk -f test.awk "$WORKFILE" >> "$OUTPUTFILE"

em que test.awk é:

#!/usr/bin/awk -f
/syopsf00/{print ""}
!/^[*]/{printf ("%s",$1" "$2" "}
END{print ""}
    
por 20.01.2015 / 23:01
0

Pure sed one-liner:

sed ':X;N;s/*//;$!bX;s/\n  /\t/g;:Y;s/\n\n//g;tY' $WORKFILE

Pode parecer bastante complicado no início, mas basicamente remove todos os * , então remove todas as novas linhas seguidas por dois espaços ( '\n ' ) e, por último, remove as novas linhas duplas \n\n para limpar. Muito provavelmente, essa expressão pode ser simplificada.

Eu incluí a guia \t em vez de espaços como separador de campo para alinhar colunas melhor, a saída é

 syopsf00          a0000096                782            1        CAStmtInv
 syopsf00          a0000096                782            1        USStmtInv
 syopsf00          a0000096                606            1        CAStmtInv
 syopsf00          a0000096                606            1        USStmtInv
 syopsf00          a0000096              23472            4        AO
 syopsf00          a0000096              23472            4        Dealer
    
por 21.01.2015 / 00:10

Tags