“cabeça” só imprimindo uma linha?

1

Eu tenho um arquivo CSV que é gerado salvando como CSV do Excel. Se eu faço "cabeça" (ou mesmo "grep" ou qualquer outra coisa), ele só imprime a primeira linha:

head -n 10 messy.csv
10,15,11,21

Mas se eu abrir o arquivo em um editor de texto ou no Excel, ele terá muitas linhas:

10,15,11,21
9,11,17,19
7,11,24,18
... 

head funciona muito bem em outros arquivos na máquina.

Por que isso? (Eu suspeito que é algo a ver com finais de linha, mas eu não sei o que.) E como posso consertar isso?

    
por Richard 03.07.2015 / 16:53

4 respostas

4

Eu acho que isso está relacionado à terminação da linha. O Excel salvará arquivos com terminações de retorno de carro / alimentação de linha, mas head estará esperando apenas feeds de linha.

Qual saída é exibida: tr -d '\r' < messy.csv | head -10

Se ele exibe as 10 linhas corretamente, essa é sua resposta.

file pode informar a linha que termina para certos arquivos de texto (ele irá imprimir ..., com terminadores de linha CRLF ), mas não faz isso para todos os arquivos de texto acredite que não faz isso se reconhecer o arquivo como algo diferente, por exemplo, HTML).

    
por 03.07.2015 / 17:14
4

Você tem \r somente como o caractere de fim de linha para as linhas 2 em diante (até a linha 10 pelo menos). A linha 1 tem \n como o caractere de fim de linha. por exemplo.

printf 'ABC\nXYZ\r123\r' | head

saída (para a tela)

ABC

Este é um artefato display relacionado à saída do terminal. O \r retrocede até o início da linha e a próxima linha sobrescreve, e a última linha é sobregravada - parcial ou parcialmente - pelo prompt do terminal.

Quando a última linha delimitada por \r for maior que o prompt, então essa linha é parcialmente revelada (além do final do prompt) - por exemplo, na seguinte saída de sampel, o prompt do terminal é apenas nn $ (5 caracteres), onde nn é o n'th comando emitido).

72 $ printf 'ABC\nXYZ\rabcdefghijklmnop\r' 
ABC
73 $ fghijklmnop

Para corrigir

sed -i.bak 's/\r$//; s/\r/\n/g' file

A opção -i.bak faz com que a entrada file seja atualizada i nline e faça um backup file.bak . Se você não quiser um backup, use apenas -i .

    
por 04.07.2015 / 14:27
1

Analise seu problema

head não se comporta como você espera. Substitua por uma ferramenta de análise simples od para ver o que está acontecendo:

od -cx messy.csv

e depois ver como head lida com este arquivo:

head -2 messy.csv | od -cx

Você notará que head está lidando com o código ASCII \r return ( 0x0d ) como foi concebido para:

faça o "retorno de carro" do escritor de tipo original. Ele apenas traz de volta a posição atual do cursor pronta para a próxima posição para escrever no "início da linha".

Corrigir

Veja o comando correto sed aqui: corrija '\ r' de um arquivo do Excel

Para o registro

Esse bug da Microsoft é o vencedor: essa codificação do fim de linha do Excel está errada para: Windows, Unix (todos), MacOS X.

Você não pode superá-lo:).

    
por 05.07.2015 / 09:37
-3

Eu acho que a maneira correta é:

head -10 file.txt (para imprimir a partir de 10 linhas)

Outra maneira pode ser:

cat file.txt | head -10

    
por 03.07.2015 / 17:00