Como classificar um arquivo no local


205

Quando usamos o sort filecomando, o arquivo mostra seu conteúdo de maneira ordenada, e se eu não quiser obter nenhum tipo de saída, exceto um arquivo classificado?


Atualize sua pergunta para explicar claramente o que você quer fazer com o resultado da classificação do arquivo. Deseja classificá-lo no lugar, substituindo o conteúdo não fileclassificado pelo conteúdo classificado do mesmo arquivo? A maneira como sua pergunta é declarada atualmente, não fazer absolutamente nada é uma resposta correta (você não deseja nenhuma saída, portanto, não faça nada).
21415 Keith Thompson

@ KeithThompson obrigado por sua preocupação, na verdade, eu estava tentando classificar um arquivo, mas quero evitar a saída na tela.
Ali Sajid

Então, para onde você quer que a saída vá? Em um novo arquivo? No arquivo original? Para a impressora no final do corredor?
21315 Keith Thompson

1
No arquivo original
Ali Sajid

execute sort infile >outfilee você obterá a saída classificada no arquivo "outfile". Então você pode apagar o "infile" original e tudo ficará bem.
Luis Colorado

Respostas:


409

Você pode usar o redirecionamento de arquivo para redirecionar a saída classificada:

sort input-file > output_file

Ou você pode usar a opção -o, --output=FILEclassificar para indicar o mesmo arquivo de entrada e saída:

sort -o file file

Nota: Um erro comum é tentar redirecionar a saída para o mesmo arquivo de entrada (por exemplo sort file > file). Isso não funciona, pois o shell está fazendo os redirecionamentos (não o programa sort (1) ) e o arquivo de entrada (como também a saída) será apagado pouco antes de dar ao programa sort (1) a oportunidade de lê-lo.


88
Boa nota sobre o erro comum
Drakes

1
Isso é realmente útil quando você precisa editar manualmente os dicionários do LaTeX, +1
Bryson S.

6
Apenas para mencionar a importância da ordem. Da GNU sortpágina de informações: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Grava a saída em OUTPUT-FILE em vez da saída padrão. Em sistemas mais recentes, -o' cannot appear after an input file if POSIXLY_CORRECT 'está definido, por exemplo, sort F -o F'. Portable scripts should specify -o OUTPUT-FILE' antes de qualquer arquivo de entrada.
Yassine ElBadaoui

14
Para evitar repetir o nome do arquivo:sort -o file{,}
tstenner 26/07

65

O sortcomando imprime o resultado da operação de classificação na saída padrão por padrão. Para obter uma classificação "no local", você pode fazer o seguinte:

sort -o file file

Isso substitui a entrada filepela saída classificada. O -ocomutador, usado para especificar uma saída, é definido pelo POSIX , portanto deve estar disponível em todas as versões de sort:

-o Especifique o nome de um arquivo de saída a ser usado em vez da saída padrão. Este arquivo pode ser o mesmo que um dos arquivos de entrada.

Se você tiver a infelicidade de ter uma versão sortsem a -oopção ( Luis me garante que eles existem), é possível obter uma edição "no local" da maneira padrão:

sort file > tmp && mv tmp file

2
+ ^ para obter a melhor resposta, e com perguntas ambíguas também, mas ainda no topo da página, é necessário aumentar.
U2N

6
sort file | sponge file

Este está no seguinte pacote Fedora:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

1
Isso também funciona no Ubuntu após a instalação comsudo apt install moreutils
Serge Stroobandt

4

Para classificar o arquivo no local, tente:

echo "$(sort your_file)" > your_file

Conforme explicado em outras respostas, você não pode redirecionar diretamente a saída de volta para o arquivo de entrada. Mas você pode avaliar o sortcomando primeiro e depois redirecioná-lo para o arquivo original. Dessa maneira, você pode implementar a classificação no local.

Da mesma forma, você também pode aplicar esse truque a outro comando, como pasteimplementar anexos em linhas.


1
Isso é ruim porque não funciona para arquivos grandes, retira as linhas de nova linha, echopode interferir com escapes de barra invertida no POSIX e -ofunciona com o mesmo arquivo que a entrada, conforme explicado em: stackoverflow.com/a/29244387/895245
Ciro Santilli Você pode usar o seguinte código

4

Aqui está uma abordagem que (ab) usa vim:

vim -c :sort -c :wq -E -s "${filename}"

A -c :sort -c :wqparte chama comandos para o vim depois que o arquivo é aberto. -Ee -ssão necessários para que o vim seja executado no modo "sem cabeça" que não atrai para o terminal.

Isso quase não traz benefícios sobre a sort -o "${filename}" "${filename}"abordagem, exceto pelo fato de usar o argumento do nome do arquivo apenas uma vez.


Isso foi útil para eu implementar uma formatterdiretiva em uma nanorcentrada para .gitignorearquivos. Aqui está o que eu usei para isso:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

4
Você está usando o vim no seu nanorc? Oh A ironia.
Brett Holman,

2

Deseja classificar todos os arquivos em uma pasta e subpasta substituindo-os?

Usa isto:

find . -type f -exec sort {} -o {} \;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.