como usar o awk / cut para obter dados da coluna que possuam espaço

3

Eu tenho dados no formato abaixo:

 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD

agora quero obter dados por coluna, estou usando o comando abaixo

awk '{print $1,$2}' 

mas como a coluna 2 tem espaços, isso me dá a saída abaixo:

16 SQL*Plus      
  16 TOAD

considerando que o que eu quero é:

16 SQL*Plus  
   16 TOAD background query session   
    
por user73680 24.02.2015 / 14:55

3 respostas

2

Se as colunas forem separadas por guias, você poderá especificar o caractere de tabulação como o separador de campos. Isso evitará que o comportamento padrão do awk trate os espaços como colunas separadas.

cat <data file> | awk -F"\t" '{print $1, $2}'

root@ubuntu32:/tmp# cat testtext | awk -F"\t" '{print $1, $2}'
16 SQL*Plus
16 TOAD background query session
    
por 24.02.2015 / 15:43
1

Uma maneira de fazer isso pode envolver unexpand . A descrição para ele e o utilitário expand podem ser encontrados aqui :

  • O utilitário unexpand deve copiar arquivos ou entrada padrão para saída padrão, convertendo <blank> caracteres no início de cada linha no número máximo de <tab> caracteres seguido pelo número mínimo de <space> caracteres necessários para preencha as mesmas posições de coluna originalmente preenchidas pelos caracteres <blank> traduzidos. Por padrão, as tabstops devem ser definidas na posição da oitava coluna. Cada <backspace> será copiado para a saída e fará com que a contagem da posição da coluna para cálculos de tabulação seja diminuída; a contagem nunca deve ser decrementada para um valor menor que um.

Você provavelmente desejaria a opção -a .

  • -a - Além de traduzir <blank> caracteres no início de cada linha, converta todas as seqüências de dois ou mais caracteres <blank> imediatamente anteriores a uma parada de tabulação ao número máximo de <tab> caracteres seguidos pelo número mínimo de <space> caracteres necessário para preencher as mesmas posições de coluna originalmente preenchidas pelos caracteres <blank> traduzidos.

É um utilitário simples para converter muitos espaços em sequência em guias. Dessa forma você poderia ...

unexpand -a <<\IN | cut -f1
 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD
IN

... que imprime ...

 16 SQL*Plus
 16 TOAD background query session

Eu só uso cut , mas se você quiser, pode usar awk ou qualquer outra coisa. Eu só sugiro isso porque você quase já o instalou, é muito simples de usar e muito rápido. Ele resolve o problema de espaço trocando delimitadores - e faz isso com muita facilidade.

Eu também uso um documento aqui apenas para mostrar como funciona, mas você provavelmente desejaria fazer isso ...

unexpand -a <infile | filter program
    
por 24.02.2015 / 18:38
0

Gostou da sugestão @Costas e outra opção é:

gawk '
  {
    f1=substr($0,2,2)
    f2=substr($0,4,36)
    gsub(/ *$/, "", f2)
    print f1 " " f2
  }
'
    
por 24.02.2015 / 16:47

Tags