@ редактировать
Спасибо @shelter за помощь! Мы можем сделать это всего за:
sed 's/\(.*\) \([0-9]*\)\([a-zA-Z]*\)/\3 \2 \1 \2\3/' |
sort -k1 -k2nr |
cut -d' ' -f3-
sed
добавляет два новых столбца впереди, один с буквой из 3-го столбца, второй столбец с номером из 3-го столбца
- Затем мы сортируем, используя первый столбец и второй столбец числовой обратный
- Затем мы удалили дополнительные добавленные столбцы.
Я оставляю старый ответ в качестве ссылки.
Это моя идея, она работает, но определенно не самая лучшая:
sed 's/\(.*\) \([0-9]*\)\([a-zA-Z]*\)/\3 \2 \1 \2\3/' |
sort -k1 |
{
presuffix=''
buff=''
while IFS=' ' read -r suffix rest; do
if [ "$presuffix" != "$suffix" ]; then
echo -n "$buff" | sort -n -r -k1
presuffix=$suffix
buff=''
fi
buff+="$rest"$'\n'
done
printf "%s" "$buff" | sort -n -r -k1
} |
cut -d' ' -f2-
- Sed get - это
1d
в начале строки, поэтому к строке добавляется d 1 ... rest of the line
. Таким образом, перед строкой стоят два новых столбца: один - для сортировки по алфавиту, а другой - для числовой.
- Затем мы сортируем, используя первый столбец (алфавит).
- Затем я разделяю поток на отдельные части, используя буфер, и перебираю каждую часть, используя второе поле (число) (первое поле get удалено в
while read
, так что теперь это первый столбец).
- Затем
cut -d' ' -f2-
убрал первый столбец (число).
- Это будет медленно из-за части
while read
, но у меня нет лучшей идеи.
@ редактировать:
Еще одно решение, действительно находящееся под влиянием комментария @shelter.
sed 's/\(.*\) \([0-9]*\)\([a-zA-Z]*\)/\3 \2 \1 \2\3/' |
while IFS=' ' read -r suffix num rest; do
echo "$(printf "%d * 256 + (256 - %d)\n" "'$suffix" "$num" | bc)" "$rest"
done |
sort -r -n |
cut -d' ' -f2-
При условии, что в отсортированном столбце есть только суффикс одного символа (1d
или 1e
или 1h
или 19d
), а числа в отсортированном столбце меньше 256 (магическое число, может быть увеличено ), мы можем преобразовать символ в число ascii.
Затем мы можем умножить число ASCII на 256 и добавить к нему число в отсортированном столбце. Число вычитается с 256, потому что в каждом блоке мы хотим выполнить обратную сортировку с использованием чисел (сначала 7d
, затем 1d
). Тогда мы просто численно отсортируем это.
В качестве альтернативы мы можем использовать printf "(256 - %d) + %d"
, а затем перевернуть числовую сортировку, разница только в том случае, если два поля равны (например, в случае files-1662192679
и files-247106034
).
Магическое число 256
должно быть больше самого большого числа в отсортированном столбце, а также больше самого большого ascii-представления символа в отсортированном столбце. Возможно, это можно расширить для обработки нескольких символов в отсортированном столбце.