Meu programa awk para mudar espaços em abas não funciona

4

Como escrever um script de shell que usa awk para ler o arquivo de dados students.txt e gerar os dados no formato tabulado, conforme mostrado:

Surname Forename MSc Stream Date of Birth
Smith John IT 15.01.1986
Taylor Susan IT 04.05.1987
Thomas Steve MIT 19.04.1986
  • Não se preocupe se as colunas com guias não estiverem alinhadas.

  • A distância entre cada uma das colunas (sobrenome, nome, MSc fluxo e data de nascimento) é uma guia.

Pergunta:

Por que esse código abaixo não funciona para mim?

awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt
    
por Host Post 04.04.2011 / 22:15

2 respostas

7

awk '{$1=$1}1' OFS="\t" students.txt

Prova de Conceito

$ awk '{$1=$1}1' OFS="\t" students.txt
Surname Forename        MSc     Stream  Date    of      Birth
Smith   John    IT      15.01.1986
Taylor  Susan   IT      04.05.1987
Thomas  Steve   MIT     19.04.1986

Explicação

O motivo pelo qual não funcionou é porque awk requer que um dos campos seja alterado antes de aplicar o novo separador de campo de saída. A solução para esse defeito (IMHO) é apenas definir um campo para si mesmo, portanto, o $1=$1

Para esse tipo de alteração simples, é melhor usar tr ou sed

tr -s ' \t' '\t*' < students.txt
sed 's/[[:space:]]\+/\t/g' students.txt
    
por 04.04.2011 / 23:11
1

Isso está errado:

awk 'BEGIN {IFS=" "} {OFS="\t"} {print $1,$2,$3,$4}' students.txt

porque você está definindo o OFS tarde demais (não no bloco BEGIN). Faça isso:

awk 'BEGIN {OFS="\t"} {print $1,$2,$3,$4}' students.txt

Não se esqueça de alterar o cabeçalho para ter 4 campos separados por espaço:

Surname Forename MSc_Stream Date_of_Birth
    
por 05.04.2011 / 04:08