Linux сортировка последнего столбца

Linux сортировка последнего столбца

Я запускаю скрипт (который я не контролирую) для получения следующего вывода. Я хочу отсортировать по последнему (3-му) столбцу. Каждый столбец отделен пробелами, а 2-й столбец включает пробелы/символы.

    > ./script
    37622       (this is || test1)&&(SGD||HKD||RMB)     40010
    43944       (this is)&&(SGD||HKD)    102732
    79378       (this is||test2)&&(HKD||RMB)    205425
    457000      (test2) && (SGD||RMB||HKD||YEN)        71
    559658      (test1||test2)&&(RMB||YEN||SGD)     14043

Я пробовал использовать sort -k, но это не работает. Затем я нашел этот вопрос -Как выполнить числовую сортировку по последнему столбцу?- предоставленное решение

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

У меня вопрос: как мне это использовать при запуске скрипта?

    > ./script | <something??>

Спасибо.

решение1

Авк

Вы можете адаптировать связанную трубу простым способом:

$ ./script | awk '{ print $NF,$0 }' | sort -k1,1 -n | cut -f2- -d' '

В awkвыражении $xссылается на x-й столбец текущей строки (начиная с 1) - а предопределенная переменная NFхранит количество столбцов текущей строки, таким образом print $NF,$0печатает для каждой строки последний столбец и полную строку (потому что $0обозначает полную строку). cutЗатем команда выводит 2-й по последний столбец каждой строки.

Часть -k1,1sort означает, что в качестве ключа сортировки используется только первый столбец — это имеет значение только тогда, когда несколько строк имеют одинаковое значение в первом столбце. Без -k1,1следующих столбцов будет влиять на относительный порядок (как вторичный и т. д. ключ сортировки) в этом случае. С -k1,1только первым столбцом в качестве ключа сортировки используется — и относительный порядок строк с тем же ключом не изменяется (т. е. выполняется стабильная сортировка).

сед

В качестве альтернативы вы можете решить эту задачу с помощью sortи sed:

$ ./script | sed 's/^\(.\+[ \t]\+\)\([0-9]\+ *\)$/\2 \1/' | \
     sort -k1,1 -n | sed 's/^\([0-9]\+\) \(.\+\)$/\2 \1/'

Там, где символ новой строки в конце первой строки экранирован \, вы можете удалить его \и ввести канал как одну строку.

Идея состоит в том, чтобы сначала переместить последний столбец вперед, отсортировать по первому столбцу, а затем снова переместить его назад.

Предполагается, что последний столбец отделен пробелами, т. е. [ \t]\+(пробелами или табуляциями).

Выражения sedвыполняют обмен через групповые ссылки (например \2 \1, ) - группы отмечены в шаблоне с помощью экранированных скобок:\(...\)

Связанный контент