The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Сценарий для сортировки строк"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

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

Оглавление

Сообщения [Сортировка по ответам | RSS]

1. Сообщение от ACCA (ok), 23-Июн-20, 21:28   +/
В потоке прицепи длину строки чем-нибудь вроде awk или perl. Потом скуси её оттуда:

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #2

2. Сообщение от nekto (?), 24-Июн-20, 01:57   +/
ондострочник на перле вспомнился

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #1 Ответы: #3

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #4, #6

4. Сообщение от Gridal (ok), 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
В принципе, все работает как надо, но вот как это все теперь упростить ))

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3 Ответы: #5, #7

5. Сообщение от universite (ok), 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...

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #8

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3

7. Сообщение от Павел Отредиезemail (?), 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  берет только второй столбец.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4

8. Сообщение от Павел Отредиезemail (?), 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 даёт на единицу больше длинну, но для сортировки годится.


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5 Ответы: #9, #10, #11, #12

9. Сообщение от Павел Отредиезemail (?), 29-Июн-20, 20:16   +/
В начале ошибка, д.б. #!/bin/bash.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

10. Сообщение от Павел Отредиезemail (?), 29-Июн-20, 20:18   +/
cat sort.txt | ./sort.sh
если препод будет докапываться.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

11. Сообщение от Павел Отредиезemail (?), 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. :^)

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

12. Сообщение от Павел Отредиезemail (?), 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

Результат:

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру