Как я могу выполнить сортировку после использования разделителя в последнем поле в сценариях bash

#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 это просто его идея, воплощенная в коде