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.
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:
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.
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
file
classificado 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).sort infile >outfile
e você obterá a saída classificada no arquivo "outfile". Então você pode apagar o "infile" original e tudo ficará bem.Respostas:
Você pode usar o redirecionamento de arquivo para redirecionar a saída classificada:
Ou você pode usar a opção
-o
,--output=FILE
classificar para indicar o mesmo arquivo de entrada e saída: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.fonte
GNU sort
pá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.sort -o file{,}
O
sort
comando 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:Isso substitui a entrada
file
pela saída classificada. O-o
comutador, usado para especificar uma saída, é definido pelo POSIX , portanto deve estar disponível em todas as versões desort
:Se você tiver a infelicidade de ter uma versão
sort
sem a-o
opção ( Luis me garante que eles existem), é possível obter uma edição "no local" da maneira padrão:fonte
Este está no seguinte pacote Fedora:
fonte
sudo apt install moreutils
Para classificar o arquivo no local, tente:
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
sort
comando 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
paste
implementar anexos em linhas.fonte
echo
pode interferir com escapes de barra invertida no POSIX e-o
funciona com o mesmo arquivo que a entrada, conforme explicado em: stackoverflow.com/a/29244387/895245Aqui está uma abordagem que (ab) usa
vim
:A
-c :sort -c :wq
parte chama comandos para o vim depois que o arquivo é aberto.-E
e-s
sã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
formatter
diretiva em umananorc
entrada para.gitignore
arquivos. Aqui está o que eu usei para isso:fonte
nanorc
? Oh A ironia.Deseja classificar todos os arquivos em uma pasta e subpasta substituindo-os?
Usa isto:
fonte