#bash #sorting #scripting
#bash #сортировка #сценарии
Вопрос:
например
предположим, что из команды, назовем ее «предыдущая», мы получаем результат, этот результат содержит строки текста
теперь, прежде чем распечатать этот текст, я хочу использовать команду сортировки, чтобы отсортировать его с помощью разделителя.
в этом случае разделителем является «*»
дело в том, что я всегда хочу сортировать по последнему полю, например, если строка такая
text*text***text*********text..*numberstext
Я хочу, чтобы моя сортировка сортировалась с использованием последнего поля, в данном случае на numberstext
если бы все строки были такими, как строка, которую я только что опубликовал, тогда это было бы легко
Я могу просто подсчитать поля, которые создаются при использовании разделителя (предположим, у нас N полей), а затем применить эту команду
previous command | sort -t * -k N -n
но не все строки имеют одинаковую форму, какая-то строка может быть такой:
text:::***:*numberstext
как вы можете видеть, я всегда хочу сортировать с использованием последнего поля
по сути, я ищу метод поиска последнего поля при использовании в качестве разделителя символа *
Я думал, что это может быть так
previous command | sort -t * -k $some_variable_denoting_the_ammount_of_fields -n
но я не уверен, есть ли что-то подобное..
спасибо 🙂
Комментарии:
1. вам нужно будет добавить фильтр, прежде
sort
чем «нормализовать» ваши данные и убедиться, что каждая запись имеет одинаковое количество полей. Удачи.2. но это невозможно, я хочу, чтобы выходные данные были похожи на входные, но отсортированы, если я сделаю это так, как вы предлагаете, не будет ли результат отличаться от ввода?
3. да, вывод будет diff . Другой вариант — написать пользовательскую сортировку на вашем любимом языке программирования. Пора идти. Удачи.
Ответ №1:
Используйте sed для дублирования конечного поля в начале строки, сортировки, затем используйте sed для удаления дубликата. Возможно, проще использовать ваш любимый язык программирования.
Ответ №2:
Вот сценарий perl для этого:
#!/usr/bin/perl
use strict;
use warnings;
my $regex = qr/*([^*]*)$/o;
sub bylast
{
my $ak = ($a =~ $regex, $1) || "";
my $bk = ($b =~ $regex, $1) || "";
$ak cmp $bk;
}
print for sort bylast (<>);
Ответ №3:
Это может сработать:
sed -r 's/.**([^*] $)/1@@@amp;/' source | sort | sed 's/^.*@@@//'
Добавьте последнее поле в начало, отсортируйте его, удалите ключ сортировки N.B. @@@
может быть любым, если оно не существует в исходном файле.
Кредит должен перейти к @Havenless это просто его идея, воплощенная в коде