Impressão dividida e condicional do Awk

1

Eu tenho um arquivo de dados feio que preciso limpar -

Date          User Name          Item Id     Title                                                                             Quantity        Price Total Amount
1/1/2015     name1             461064485   Description One Has Spaces                                                                  1     $899.99              $899.99
         Real Name 1                Real Address With Spaces                                                  Location, Real 55555                    555-555-5555

1/2/2015     name2 has spaces 461222501   Description still has spaces                                                                  1     $229.99              $229.99
         Real Name                 Real Address 2 w spaces                                                   Real Location2 55556                    555-555-5556

Isso funciona melhor até agora:

awk -F "  +" '/^[0-9]\/*[0-9]\// {print $1, $3, $5, $6, $7}' Table.txt > x.txt

mas é suspenso, o nome de usuário fica muito longo e fica a apenas um espaço do ID do item. Nesse caso, $ 2 se torna o desejado $ 2 + $ 3.

Eu tentei dividir e imprimir como

awk -F "  +" '/^[0-9]*\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," "); print $1, subfields[-1], $4, $5, $6} {if (length ($2) < 15) print $1, $3, $5, $6, $7}' Table.txt > x.txt

que funciona, mas processa tudo ou o processa duas vezes; ou

awk -F "  +" '/^[0-9]\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," ") print "$1, subfields[-1], $4, $5, $6"; else print "$1, $3, $5, $6, $7" }' Table.txt > x.txt

mas não consigo obter a sintaxe correta sem processá-la duas vezes, processando todas as linhas (não sei por que, já que o algoritmo de busca deve processar apenas linhas iniciadas por datas) ou recebendo erros sobre impressão ou minha declaração .

Eu planejo fazer o upgrade para um printf, então também fixei as larguras das colunas, mas não consigo corrigir minha sintaxe.

Saída desejada (idealmente com larguras de colunas fixas):

1/1/2015    461064485    1    $899.99    $899.99
1/2/2015    461222501    1    $229.99    $229.99 
    
por C.A.R. 24.12.2015 / 22:24

1 resposta

1

Eu peguei uma de suas versões e modifiquei um pouco:

awk -F "  +" -v'OFS=\t' '/^[0-9]+\/[0-9]+\//{ \
     if(length($2)>=15){ \
           brokenfield=$2; n=split(brokenfield,subfields," "); \
           print $1,subfields[n],$4,$5,$6 \
     } \
     else {print $1,$3,$5,$6,$7} \
}' file

Saída:

1/1/2015    461064485   1   $899.99 $899.99
1/2/2015    461222501   1   $229.99 $229.99

Algumas observações:

  • você esqueceu de colocar chaves {} em declarações condicionais
  • Não acho que awk ofereça suporte a um índice de matriz negativo (pelo menos não meu gawk )
  • split retorna o número de elementos da matriz, portanto, você pode usá-lo como um índice do último elemento da matriz ( n no caso acima)
  • \t é usado como separador de campos de saída para alinhar colunas bem
por 24.12.2015 / 22:56