Добрый день! Помогите новичку в BASH. Есть несколько строк с разным количеством символов (aa,bbbb, ccc, 111 и т.д.). Их надо отсортировать так, чтобы вначале шли строки с наибольшим кол-ом символов, а строки с одинаковым кол-ом символов шли в алфавитном порядке.
Я знаю команды для подсчета кол-ва символов в строке (expr length) и могу их сравнивать между собой. Если бы строк было две - все было бы просто. А с большим кол-ом строк мне никак не придумать как их отсортировать.
Заранее спасибо!
В потоке прицепи длину строки чем-нибудь вроде awk или perl. Потом скуси её оттуда:perl -e 'printf "%06i\t%s",length($_),$_ while (<>);' yourfile.txt | sort | cut -f 2-
ондострочник на перле вспомнился
Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.
> Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.Спасибо большое за помощь! Но видимо, я даже на падавана пока не гожусь. ))
Я написал такой скриптик (data.txt - это файл с нашими строками)
awk ' length($0) == 6 ' data.txt|sort
awk ' length($0) == 5 ' data.txt|sort
awk ' length($0) == 4 ' data.txt|sort
awk ' length($0) == 3 ' data.txt|sort
awk ' length($0) == 2 ' data.txt|sort
awk ' length($0) == 1 ' data.txt|sort
В принципе, все работает как надо, но вот как это все теперь упростить ))
>[оверквотинг удален]
> гожусь. ))
> Я написал такой скриптик (data.txt - это файл с нашими строками)
> awk ' length($0) == 6 ' data.txt|sort
> awk ' length($0) == 5 ' data.txt|sort
> awk ' length($0) == 4 ' data.txt|sort
> awk ' length($0) == 3 ' data.txt|sort
> awk ' length($0) == 2 ' data.txt|sort
> awk ' length($0) == 1 ' data.txt|sort
> В принципе, все работает как надо, но вот как это все теперь
> упростить ))Если символов в строке больше 6 ?
https://www.unix.com/shell-programming-and-scripting/245099-...
https://stackoverflow.com/questions/36493766/awk-sort-a-stri...дальше гуглите сами.
Вот для сдачи преподу
sort.sh:
#bin/bash
while read string
do
len=`echo $string | wc -m`
echo "$len $string"
done | sort -g | cut -f 2
Между $len и $string в echo табуляция.
Usage:
cat sort.txt | bash sort.sh
wc -m даёт на единицу больше длинну, но для сортировки годится.
В начале ошибка, д.б. #!/bin/bash.
cat sort.txt | ./sort.sh
если препод будет докапываться.
>[оверквотинг удален]
> len=`echo $string | wc -m`
> echo "$len $string"
> done | sort -g | cut -f 2
>
PS препод завалит незнайку, надо знать используемые клманды и ключи. Читай man wc, man sort, man cut. :^)
Недочитал задание, мой окончательный вариант:
#bin/bash
while read string
do
len=`echo $string | wc -m`
echo "$len $string"
done | sort -k 1nr -k 2d | cut -f 2
Результат:
ааабббвввгггдддееежжжззз
бббвввгггддд
бббвввгггддд
ааабббввв
ааабббввв
аааббб
аааввв
ааа
>[оверквотинг удален]
> гожусь. ))
> Я написал такой скриптик (data.txt - это файл с нашими строками)
> awk ' length($0) == 6 ' data.txt|sort
> awk ' length($0) == 5 ' data.txt|sort
> awk ' length($0) == 4 ' data.txt|sort
> awk ' length($0) == 3 ' data.txt|sort
> awk ' length($0) == 2 ' data.txt|sort
> awk ' length($0) == 1 ' data.txt|sort
> В принципе, все работает как надо, но вот как это все теперь
> упростить ))Для твоего понимания
АССА добавляет в начало каждой строки количество её символов потом пробел и саму строку. Дальше передаёт это на вход команды сорт. Она хорошо сортирует сначала по цифрам в начале строки, при равенстве дальше по алфавиту. Последний cut берет только второй столбец.
> Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.Далеко не всякий джедай осилит сортировку по двум критериям в конвейере ))