SORT esvazia meu arquivo?

2

Estou tentando sort a csv na minha máquina, mas parece que estou apagando o conteúdo toda vez que uso o comando sort . Eu basicamente criei uma cópia do meu csv sem a primeira linha:

sed '1d' original.csv > newcopy.csv

Para confirmar que minha nova cópia existe sem a primeira linha, posso verificar com head :

head 1 newcopy.csv

Com certeza, ele encontra meu arquivo e me mostra o segundo original agora (agora na primeira linha). Meu csv consiste em vários valores separados por vírgulas:

Jonathan Sampson,,,,[email protected],,,GA,United States,,
Jane Doe,Mrs,,,[email protected],,,FL,United States,32501,

Como indicado acima, alguns campos estão vazios. Eu quero classificar com base no campo de endereço de email, que é 4 ou 5 - dependendo se o comando sort usa um índice baseado em zero. Então estou tentando o seguinte:

sort -t, +4 -5 newcopy.csv > newcopy.csv

Estou usando -t, para indicar que meus campos são terminados pela vírgula, em vez de um espaço. Não tenho certeza se +4 -5 realmente classifica no campo de email ou não - eu poderia usar alguma ajuda aqui. E então newcopy.csv > newcopy.csv para sobrescrever o arquivo original com novos resultados de classificação.

Depois de fazer isso, se eu tentar ler na primeira linha:

head 1 newcopy.csv

Eu recebo o seguinte erro:

head: cannot open '1' for reading: No such file or directory ==> newcopy.csv <==

De fato, se eu verificar meu diretório, o arquivo estará vazio e com 0 bytes.

    
por Sampson 18.05.2010 / 16:46

2 respostas

3

O redirecionamento trunca o arquivo de saída antes de ser lido no lado da entrada. Você precisará usar um arquivo temporário.

Editar:

Veja um exemplo:

sort -t, -k 5,5 newcopy.csv > tmp.csv && mv tmp.csv newcopy.csv

Os campos de classificação são baseados em um. Este comando diz para ordenar com base apenas no campo cinco, saída para um arquivo temporário e apenas mover o arquivo temporário para o nome original se a ordenação sair sem erros.

    
por 18.05.2010 / 16:51
1

Observe que o parâmetro sort tem -o , que grava os resultados no arquivo, em vez da saída padrão, portanto, você deve fazer:

sort -t, +4 -5 -o newcopy.csv newcopy.csv

desde quando se usa o operador de redirecionamento (como > ou >> ) o shell cria / trunca o arquivo antes que o comando seja chamado.

    
por 26.03.2016 / 02:28