URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10314
[ Назад ]

Исходное сообщение
"Сценарий для сортировки строк"

Отправлено Gridal , 23-Июн-20 20:15 
Добрый день! Помогите новичку в BASH. Есть несколько строк с разным количеством символов (aa,bbbb, ccc, 111 и т.д.). Их надо отсортировать так, чтобы вначале шли строки с наибольшим кол-ом символов, а строки с одинаковым кол-ом символов шли в алфавитном порядке.
Я знаю команды для подсчета кол-ва символов в строке (expr length) и могу их сравнивать между собой. Если бы строк было две - все было бы просто. А с большим кол-ом строк мне никак не придумать как их отсортировать.
Заранее спасибо!

Содержание

Сообщения в этом обсуждении
"Сценарий для сортировки строк"
Отправлено ACCA , 23-Июн-20 21:28 
В потоке прицепи длину строки чем-нибудь вроде awk или perl. Потом скуси её оттуда:

perl -e 'printf "%06i\t%s",length($_),$_ while (<>);' yourfile.txt | sort | cut -f 2-


"Сценарий для сортировки строк"
Отправлено nekto , 24-Июн-20 01:57 
ондострочник на перле вспомнился


"Сценарий для сортировки строк"
Отправлено ACCA , 24-Июн-20 08:07 
Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.


"Сценарий для сортировки строк"
Отправлено Gridal , 24-Июн-20 14:21 
> Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.

Спасибо большое за помощь! Но видимо, я даже на падавана пока не гожусь. ))

Я написал такой скриптик (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
В принципе, все работает как надо, но вот как это все теперь упростить ))


"Сценарий для сортировки строк"
Отправлено universite , 24-Июн-20 15:09 
>[оверквотинг удален]
> гожусь. ))
> Я написал такой скриптик (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...

дальше гуглите сами.


"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 29-Июн-20 20:15 
Вот для сдачи преподу

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 даёт на единицу больше длинну, но для сортировки годится.



"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 29-Июн-20 20:16 
В начале ошибка, д.б. #!/bin/bash.

"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 29-Июн-20 20:18 
cat sort.txt | ./sort.sh
если препод будет докапываться.

"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 29-Июн-20 20:25 
>[оверквотинг удален]
>     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 даёт на единицу больше длинну, но для сортировки годится.

PS препод завалит незнайку, надо знать используемые клманды и ключи. Читай man wc, man sort, man cut. :^)


"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 30-Июн-20 13:44 
Недочитал задание, мой окончательный вариант:

#bin/bash
while read string
do
    len=`echo $string | wc -m`
    echo "$len    $string"
done | sort -k 1nr -k 2d | cut -f 2

Результат:

ааабббвввгггдддееежжжззз
бббвввгггддд
бббвввгггддд
ааабббввв
ааабббввв
аааббб
аааввв
ааа


"Сценарий для сортировки строк"
Отправлено Павел Отредиез , 29-Июн-20 20:01 
>[оверквотинг удален]
> гожусь. ))
> Я написал такой скриптик (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  берет только второй столбец.


"Сценарий для сортировки строк"
Отправлено Pahanivo , 25-Июн-20 16:22 
> Это для джедаев. Падаванам нужно чуть попроще, чтобы прониклись силой.

Далеко не всякий джедай осилит сортировку по двум критериям в конвейере ))