Как я могу отсортировать после использования разделителя на последнем поле в сценарии Bash - PullRequest
2 голосов
/ 31 октября 2011

например

предположим, что из команды, назовем ее «предыдущая», мы получим результат, этот результат содержит строки текста

Теперь перед печатью этого текста я хочу использоватькоманда сортировки для сортировки с использованием разделителя.

в этом случае разделитель равен "*"

, дело в том, что я всегда хочу отсортировать по последнему полю, например, еслистрока выглядит так:

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

но я не уверен, есть ли что-нибудь подобное ..

спасибо :)) 1032 *

Ответы [ 3 ]

2 голосов
/ 31 октября 2011

Используйте sed для дублирования последнего поля в начале строки, сортируйте, а затем используйте sed для удаления дубликата.Возможно, проще использовать ваш любимый язык программирования.

0 голосов
/ 31 октября 2011

Это может сработать:

 sed -r 's/.*\*([^*]+$)/\1@@@&/' source | sort | sed 's/^.*@@@//'

Добавить последнее поле впереди, отсортировать его, удалить ключ сортировки N.B. @@@ может быть чем угодно, если его нет в исходном файле. Кредит должен идти на @Havenless, это просто его идея, воплощенная в коде

0 голосов
/ 31 октября 2011

Вот 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 (<>);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...