Acho que agora tenho bastante experiência na classificação por colunas ; no entanto, ainda não encontrei nada até agora sobre como classificar linhas contínuas .
Supondo que tenhamos um arquivo de texto parecido com este: (muito simplificado, é claro)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Agora, é possível classificar as linhas alfanumericamente por cada bloco separadamente ? Quero dizer, para que o resultado fique assim:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
Contando com o que encontrei na sort
página de manual, isso pode não ser possível com o sort
comando UNIX interno. Ou isso pode ser feito sem ter que recorrer a ferramentas externas / de terceiros?
fonte
awk
solução que evita asort
sobrecarga! Sorrateiro!Definir o separador de registros
RS
como uma sequência vazia faz com que awk avance nos parágrafos de cada vez. Para cada parágrafo, canalize o parágrafo (in$0
) para cmd (que está definido comosort
) e imprima a saída. Imprima uma linha em branco para separar os parágrafos de saída com aprint ""
.Se estamos dando exemplos de perl, apresento uma abordagem alternativa à de Stephane:
Desative o separador de campos (
undef $/
), isso nos permite usar<>
e obter todo o STDIN. Nós, então,split
por aí\n\n
(parágrafos).foreach
"paragraph",sort
as linhassplit
tocando novas linhas, introduzindo-sort
as ejoin
juntando-as novamente e seguindo uma trilha\n
.No entanto, isso tem um efeito colateral de adicionar um separador "parágrafo final" no último parágrafo (se ele não tivesse um antes). Você pode contornar isso com o pouco menos bonito:
Isso atribui os parágrafos a
@list
e, em seguida, há uma "operação ternária" para verificar se é o último elemento daforeach
(a\$_ == \$list[-1]
verificação). imprima""
se for (? ...
), else (: ...
) imprima"\n"
para todos os outros "parágrafos" (elementos de@list
).fonte
/usr/bin/sort
com essa linha ou é umawk
comando interno de "classificação"?Eu escrevi uma ferramenta em haskell que permite que você use sort, shuf, tac ou qualquer outro comando em parágrafos de texto.
https://gist.github.com/siers/01306a361c22f2de0122
EDIT: a ferramenta também está incluída neste repositório: https://github.com/siers/haskell-import-sort
Ele divide o texto em blocos, une os sub-blocos com
\0
char, canaliza o comando e finalmente faz a mesma coisa ao contrário.28-08-2015 : Encontrei outro uso pessoal para esta ferramenta - selecionando N parágrafos após uma linha.
fonte
Se você tiver o GNU awk disponível, poderá classificar cada bloco usando a
asort()
função interna. Algo assim:blocksort.awk
Execute-o assim:
fonte
TXR Lisp passo a passo:
Referências: get-lines , partition * , op , where , chain , length , zerop , mapcar , interpose .
fonte
[mapcar sort ...]
nós poderíamos substituirsort
por uma função que canaliza as cordas através de um processo externo. Podemos então acabar com uma ferramenta para distribuir um comando externo de processamento de texto por parágrafos.