Сортировка строк в текстовом файле с определенным разделителем в Linux

Мне нужно отсортировать строки текстового файла (без какого-либо расширения), где строки разделены %. При использовании команды sort те % также сортируются, что я не хочу.

Как отсортировать текстовый файл из командной строки или любым другим способом и сохранить с тем же именем?

Например:

имя файла: myfile

Перед сортировкой >>

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

После сортировки >>

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

Желаемый >>

A line one
%
B line three
%
C line two
%
3
задан 1 July 2013 в 14:53

2 ответа

Я разделил бы разделитель (awk ищет нечетные строки), отсортируйте его во временный файл (см. комментарии), и затем sed, что файл для добавления разделителя назад.

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

Это просто выводы к stdout так засуньте a > myfile на конце его, если Вы хотите, чтобы это передало тот по каналу назад в Ваш файл. Я оставил это пустым, таким образом, можно протестировать его.

Боковая панель: существует приблизительно сто различных способов обработать реинтеграцию разделителей. Они все работали бы:

awk '{print $0"\n%"}'
while read line; do echo -e "$line\n%"; done
xargs -i^ echo -e "^\n%"  # won't work with a redirection >
2
ответ дан 1 July 2013 в 14:53

Может быть, это не лучшее решение для производительности, но этот двойной вызов awk может сделать это:

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

RS является «разделителем входных записей» и ORS «разделителем выходных записей» .

Вывод после sort таков, так что становится ясно, что мы просто работаем со строками без%:

$ awk 'BEGIN{RS="\n%\n"}1' file | sort 
A line one
B line three
C line two
0
ответ дан 1 July 2013 в 14:53

Другие вопросы по тегам:

Похожие вопросы: