
Я запускаю скрипт (который я не контролирую) для получения следующего вывода. Я хочу отсортировать по последнему (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,1
sort означает, что в качестве ключа сортировки используется только первый столбец — это имеет значение только тогда, когда несколько строк имеют одинаковое значение в первом столбце. Без -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
, ) - группы отмечены в шаблоне с помощью экранированных скобок:\(...\)