Classificar linhas no arquivo de texto com um separador específico no Linux

2

Eu preciso ordenar as linhas de um arquivo de texto (sem qualquer extensão) onde as linhas são separadas por % . Ao usar o comando sort , esses % s também estão sendo classificados, o que eu não quero.

Como ordenar o arquivo de texto na linha de comando ou por qualquer outro método e salvar com o mesmo nome?

Por exemplo:

nome do arquivo: myfile

Antes de ordenar > >

A line one
%
C line two
%
B line three
%

Após classificar > >

%
%
%
A line one
B line three
C line two

Desejado > >

A line one
%
B line three
%
C line two
%
    
por cosmicraga 01.07.2013 / 12:47

2 respostas

1

Eu removeria o separador ( awk está procurando por linhas ímpares), classificá-lo em um arquivo temporário (veja os comentários) e depois sed esse arquivo para adicionar o separador de volta.

awk 'NR%2==1' myfile | sort -o tmpfile; sed -r 's/$/\n\%/g' tmpfile

Isso resulta em stdout , então coloque um > myfile no final dele, se você quiser enviar de volta para o seu arquivo. Deixei-o nu para que você possa testá-lo.

Barra lateral: Existem cerca de cem maneiras diferentes de lidar com a reinserção dos separadores. Tudo isso funcionaria:

awk '{print $0"\n%"}'
while read line; do echo -e "$line\n%"; done
xargs -i^ echo -e "^\n%"  # won't work with a redirection >
    
por Oli 01.07.2013 / 13:01
2

Talvez não seja a melhor solução de desempenho, mas essa dupla awk de chamadas pode fazer isso:

$ awk 'BEGIN{RS="\n%\n"}1' file | sort | awk 'BEGIN{ORS="\n%\n"}1'
A line one
%
B line three
%
C line two
%

RS é "separador de registro de entrada" e ORS "separador de registro de saída".

A saída depois de sort é isso, então fica claro que estamos apenas trabalhando com as linhas sem%:

$ awk 'BEGIN{RS="\n%\n"}1' file | sort 
A line one
B line three
C line two
    
por fedorqui 01.07.2013 / 13:24