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?

Ali Sajid
fonte
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.

Sylvain Bugat
fonte
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
Tom Fenech
fonte
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
SilverlightFox
fonte
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.

Bo Tian
fonte
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
Anthony Sottile
fonte
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 {} \;
luandrea
fonte