escreve um número de strings usando awk

1

Eu tenho dados em texto em 4 colunas, mas a última coluna é um texto (contém strings variáveis), como mostrado abaixo

Column1 Column2 Column3 Column4
5678    567     56      hello
1234    123     12      hello there

Eu quero escrever ou exibir apenas a quarta coluna usando awk como: awk '{print $4}' , mas column4 mostra apenas a primeira string. Como posso mostrar texto usando awk ou qualquer outro comando de formatação.

Obrigado.

    
por ASAD 18.12.2016 / 17:47

3 respostas

0

Acho que a maneira mais fácil é provavelmente uma mistura de tr (para garantir que haja apenas um espaço entre cada coluna) e cut para obter as colunas 4 e seguintes:

$ cat test.txt | tr -s ' ' | cut -f 4- -d ' '
Column4
hello
hello there

Se tiver certeza de que todas as colunas estão alinhadas, com espaços (não guias), isso é mais curto:

$ cut -c 25- < test.txt
Column4
hello
hello there

E a obrigatória awk solution:

$ awk '{ $1=$2=$3=""; print $0 }' < test.txt
   Column4
   hello
   hello there

Observe os espaços em branco no início de cada linha de saída, em comparação com as duas soluções anteriores.

    
por John N 18.12.2016 / 18:15
0

A coluna 4 está sendo dividida quando você usa {print $ 4} porque awk interpreta e espaço (por exemplo, entre "olá" e "lá") como um delimitador, e neste exemplo o "lá" estaria no campo 5.

Dependendo de como o arquivo é formatado, há várias respostas possíveis (algumas mais fáceis do que outras).

Se todas as colunas estiverem separadas por um único caractere de tabulação, use

awk -F \t '{print $4}' (-F aqui define o separador arquivado para uma única guia)

Se todas as colunas forem separadas por um ou mais caracteres de tabulação, use

awk -F '[\t]+' '{print $4}' (-F aqui define o separador de campo para uma ou mais guias)

Se as primeiras colunas forem sempre um número fixo de caracteres (digamos 20), use

awk '{print substr($0, 21)}'

(o comando substr simplesmente imprime a cal de entrada do 21º caractere até o fim)

ou, se nenhum dos acima

awk '{for (i=4; i<=NF; i++) printf "%s ", $i print ""}'

(esse loop imprime todos os campos do quarto ao final da linha)

    
por Nick Sillito 18.12.2016 / 18:23
0

Se o formato do seu arquivo de entrada é que cada coluna é separada por dois ou mais espaços, e uma entrada válida na coluna 4 nunca terá mais de um espaço em uma linha, você pode usar a seguinte solução, em que o campo separador é definido para dois ou mais espaços.

awk -F " [ ]+" '{print $4}'

Exemplo de saída:

hello hello there

(Observe que o cabeçalho "Coluna4" foi rejeitado porque há apenas um espaço entre cada um dos títulos)

    
por Nick Sillito 18.12.2016 / 18:36