Используя команду сортировки, в то время как строки в первом столбце повторяются

У меня есть файл данных следующим образом;

ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99 
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

Мне нужно отсортировать эти строки по строкам в первом столбце следующим образом;

ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99 
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

Но когда я выполню sort -k 1 dataЯ вижу, что числовые значения во втором столбце сортируются по возрастанию. Какая команда производит вышеуказанную сортировку?

2 ответа

Решение

Есть две вещи, которые вам нужно сделать.

Первый, sort -k 1 начинается с ключа 1, но по умолчанию останавливается в конце строки: для сортировки только по ключу 1 необходимо -k 1,1

Во-вторых, по умолчанию GNU sort выполняет окончательную сортировку "последней инстанции" по всей строке - для подавления этого необходимо добавить --stable вариант.

Так

$ sort --stable -k 1,1 data
ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

Это отсортирует по первому столбцу в порядке возрастания (как обычно), а затем по второму столбцу в порядке убывания (в обратном порядке). Второй столбец интерпретируется как число:

$ sort -k 1,1 -k 2nr,2 < in.txt
ALIC 5.55 2.65 3.45
ALIC 2.56 2.78 3.99
ALIC 1.00 1.00 1.00
ALIC 0.95 1.00 1.00
AMC4 3.55 3.66 4.88
AMC4 3.00 3.67 4.78
AMC4 0.50 1.00 1.00
AMC4 0.01 1.00 1.00

Вы можете добавить --debug флаг, чтобы увидеть, какие именно ключи sort работает:

$ sort --debug -k 1,1 -k 2nr,2 < in.txt
ALIC 5.55 2.65 3.45
____
     ____
___________________
ALIC 2.56 2.78 3.99
____
     ____
___________________
ALIC 1.00 1.00 1.00
____
     ____
___________________
...
Другие вопросы по тегам