Сортировка по строкам

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Kilik
Сообщения: 8

Сортировка по строкам

Сообщение Kilik »

Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Сортировка по строкам

Сообщение serzh-z »

Kilik писал(а):
24.12.2010 18:43
Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.
Используя какие средства? Python, Perl, awk, bash?.. В последнем случае, кажется, - никак, если не использовать альтернативу sort или не писать собственную функцию сортировки.
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

serzh-z писал(а):
24.12.2010 18:54
Kilik писал(а):
24.12.2010 18:43
Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.
Используя какие средства? Python, Perl, awk, bash?.. В последнем случае, кажется, - никак, если не использовать альтернативу sort или не писать собственную функцию сортировки.

Используя bash...а какие есть альтернативы sort?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: Сортировка по строкам

Сообщение eddy »

Средствами sqlite :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: Сортировка по строкам

Сообщение Lan4 »

Kilik писал(а):
24.12.2010 18:43
Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.

написать скрипт, который собственно выполняет сортировку одним из извесных алгоритмов.
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

Вопрос опять же заключается в том: можно ли это сделать средствами bash?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Kilik писал(а):
24.12.2010 18:43
Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.

с какой целью?
можно попробовать насоздавать кучу файлов, и вывести их командой ls. Более конструктивные мысли в голову не лезут.
eddy писал(а):
24.12.2010 19:11
Средствами sqlite smile.gif

MySQL
а чё?

Kilik писал(а):
24.12.2010 19:28
Вопрос опять же заключается в том: можно ли это сделать средствами bash?

можно!
сейчас напишу.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Код: Выделить всё

#!/bin/bash

declare -A a
index=0
while read s;
do
    echo "$s"
    a[$index]="$s"
    ((index = index + 1))
done < "$1"


is_all_sort=0

while [ $is_all_sort = 0 ]; do
    is_all_sort=1
    for ((j = 0; j < index - 1; j++))
    do
        (( k = j + 1 ))
        if [[ "${a[$j]}" < "${a[$k]}" ]]; then
            temp="${a[$j]}"
            a[$j]="${a[$k]}"
            a[$k]="$temp"
            is_all_sort=0
        fi
        echo "$j ${a[$j]}"
    done
done

echo "-----------------------"

for ((j = 0; j < index; j++))
do
    echo "$j ${a[$j]}"
done
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

кстати, причём тут эхотаг?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

Спасибо) А что означает fi????

drBatty писал(а):
24.12.2010 20:14
кстати, причём тут эхотаг?

Вы меня спрашиваете?)))
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Kilik
нзч. чуть пальцы не сломал набирая ${a[$j]}, лучше выберите другой язык...

Да, здесь есть раздел про программирование и про командную строку. Или я писал этот скрипт в образовательных целях? "Так делать нельзя!"
Тогда ещё не хватает тестов на производительность... Они убедят любого, что использовать баш здесь == идиотизм. ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

drBatty писал(а):
24.12.2010 20:54
Kilik
нзч. чуть пальцы не сломал набирая ${a[$j]}, лучше выберите другой язык...

Да, здесь есть раздел про программирование и про командную строку. Или я писал этот скрипт в образовательных целях? "Так делать нельзя!"
Тогда ещё не хватает тестов на производительность... Они убедят любого, что использовать баш здесь == идиотизм. ;)


Цели как раз таки образовательные) я и писал в соответствующей теме...просто была поставлена такая задача: отсортировать без sort. Прочитал документацию в интернете bash scripting guide и про всевозможное использование cat и grep. К логическому заключения не пришел. На чем собственно писать если не на Bash(я пользовался до этого только им, когда выполняли другие задачи, например, обычная сортировка)? sqlite мне кажется в моем случае не лучшее решение. Я просто осознал сейчас приведенный скрипт и сам себе задал вопрос: может не в том направлении я мыслю и мне дали это задание, чтобы я разобрался с другими средствами? Как вы думаете: если не bash - то какими средствами это сделать было бы логичнее? Администрирование Linux изучаем не так давно(изучали терминал и скрипты). Где можно что-то прочесть по данному вопросу? Или вы можете что-то посоветовать?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Kilik писал(а):
24.12.2010 21:28
Цели как раз таки образовательные) я и писал в соответствующей теме...просто была поставлена такая задача: отсортировать без sort.

это не UnixWay. Не наш путь. У нас принято, что для каждой задачи есть специальная утилита, которая только её(задачу) и выполняет. Но делает это хорошо. Например для разного рода сортировок есть sort, для обработки текстов (автоматической, не ручной) есть sed, для фильтрации некоторых подстрок есть grep, а для сравнения текстов есть diff. Для связи этого всего в единое целое (если задача разбивается на под-задачи) есть bash.

В принципе, все эти утилиты могут выполнять и другую работу, можно сортировать на bash'е, писать скрипты в sed'е... Только это не наш путь - получается ерунда (хотя и занимательная - одна девушка написала тетрис на sed).

Kilik писал(а):
24.12.2010 21:28
Как вы думаете: если не bash - то какими средствами это сделать было бы логичнее?


ну я-бы взял чистый С, с qsort() (man 3 qsort), там всего 10-20 строчек надо (прочитать файл, записать файл). кто-то другой - свой любимый ЯП.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
reg123
Сообщения: 284
ОС: Vista

Re: Сортировка по строкам

Сообщение reg123 »

Заранее извиняюсь за некоторое злорадство и за то что не по теме. За 1 минуту нашел как это сделать в Windows PowerShell, с подробными описаниями на русском!
Вот те и рассуждения, какая убогая командная строка в вЕнде :tongue:
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Сортировка по строкам

Сообщение NickLion »

reg123, это к чему? sort и в GNU/Linux есть. Вопрос стоял как это сделать через ж, не используя sort.

PS PowerShell не так уж плох, хотя опять в МС всё усложняют из-за оперирования объектами, а не просто текстовый поток.

PPS консоль в винде (как сам эмулятор терминала) таки ужасная
Спасибо сказали:
reg123
Сообщения: 284
ОС: Vista

Re: Сортировка по строкам

Сообщение reg123 »

NickLion

Хм, да я не про sort. Я понял смысл задачи. Я про внутреннюю справку по powershell с хорошим поиском. И отсортировал я не sort-ом, кстати. :tongue:
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

reg123 писал(а):
25.12.2010 14:58
За 1 минуту нашел как это сделать в Windows PowerShell, с подробными описаниями на русском!

дык я и пишу - это не UNIX-Way. Такое может придти в голову только лишь пользователю Windows. Вопрос из серии:

- Как забить гвоздь отвёрткой?! (без молотка).

Я думаю, опытный столяр вас пошлёт подальше ну может и забьёт конечно, за очень дополнительные $$$. Или что-бы показать свою крутизну (ну как я - дескать и такая отвёртка у меня есть!), но это не лучшая идея.

reg123 писал(а):
25.12.2010 14:58
Вот те и рассуждения, какая убогая командная строка в вЕнде


там не только сам shell убогий, но и всё остальное - была-бы у них нормальная sort, не занимались-бы ерундой. Видать у них какой-то кривой молоток, если в сети можно за 1 секунду найти ман по забиванию гвоздей отвёрткой ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

reg123 писал(а):
25.12.2010 15:48
Хм, да я не про sort. Я понял смысл задачи. Я про внутреннюю справку по powershell с хорошим поиском. И отсортировал я не sort-ом, кстати.

меня давно занимает вопрос: как найти в вендовой справке слово time? Только не просто time, а ПРОСТО \<time\> ? А вот тут давеча на лоре спор был - сколько раз в справке упомянуто слово "директория"? Я получил ответ за пару минут, причём без гугла. И это очень простые запросы, из тех, которыми я мучаю свою встроенную справку... Поиск в вендовой справке намного хуже, просто он простой, тупой, и примитивный. Потому и освоить проще.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

Т.е. если я пишу на Си:

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int cmp_func(const void *a, const void *b){
        return strcmp(*(char**)a, *(char**)b);
}

#define FILE_NAME "qsort.txt"

int main(void){
        FILE *f;
        long num, i;
        char **arr, buf[BUFSIZ], *p;
  if ( ( f = fopen(FILE_NAME, "r") ) == NULL ){
                fprintf(stderr, "Ошибка открытия файла!\n");
                exit(1);
        }

        arr = NULL;
        num = 0;
        while ( fgets(buf, BUFSIZ, f) ){
                if ( p = strrchr(buf, '\n') )
                        *p = '\0';
                if ( ! *buf )
                        continue;
                if ( ( arr = realloc(arr, sizeof(char*) * (num + 1)) ) == NULL ){
                        fprintf(stderr, "Ошибка памяти!\n");
                        fclose(f);
                        exit(1);
                }
                if ( ( arr[num++] = strdup(buf) ) == NULL ){
                        fprintf(stderr, "Ошибка памяти!\n");
                        fclose(f);
                        exit(1);
                }
        }
        fclose(f);

        printf("\nСтроки, прочитанные из файла:\n");
        for ( i = 0; i < num; ++i )
                printf("%s\n", arr[i]);

        qsort(arr, num, sizeof(char*), cmp_func);

        printf("\nСтроки, отсортированные по возрастанию:\n");
        for ( i = 0; i < num; ++i )
                printf("%s\n", arr[i]);

        for ( i = 0; i < num; ++i )
                free(arr[i]);
        free(arr);

        exit(0);
}


И запускаю это как скрипт из shell(ну тупо открываю его) - оно должно нормально работать? Что-то как-то не очень(на windows visual вроде как работает - проверял). На Linux ничего(путь даже прописывал полный).

Не думаю что от меня хотят кода на Си(или другого языка программирования). Мы использовали только shell и изучали возможности сценариев Bash. При чем тут Си я не знаю(не по материалу пройденному)... И вообще как-то странно "сортировать строки без sort". Я просто в тупике - на данном этапе читаю Алексея Береснева 2-издание "Администрирование GNU/Linux с нуля" - пока ничего полезного по этой теме не подчеркнул.

Вы считаете что самое логичное(и практичное) написать на любом ЯП(предпочтительнее Си) ибо писать сценарий bash - мягко говоря "непонятно зачем"?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Kilik писал(а):
25.12.2010 16:26
И запускаю это как скрипт из shell(ну тупо открываю его) - оно должно нормально работать? Что-то как-то не очень(на windows visual вроде как работает - проверял). На Linux ничего(путь даже прописывал полный).

1) BUFSIZ что такое?
2) много ещё всякого... :(

Но идея именно такова.
Kilik писал(а):
25.12.2010 16:26
Вы считаете что самое логичное(и практичное) написать на любом ЯП(предпочтительнее Си)

предпочтительнее - не С, а тот, который вы хорошо знаете. Например можно на php:

Код: Выделить всё

<?php

$file_name="snow.py";


$a = file($file_name);
if($a === FALSE){
    echo "can't open $file_name\n";
    die(77);
}


foreach($a as $s)
    echo "$s";
echo "----\n";

sort($a);

foreach($a as $s)
    echo "$s";
echo "----\n";

?>


Тут дело вот в чём: практически в ЛЮБОМ языке есть функция sort(), потому не стОит придумывать велосипед.
Kilik писал(а):
25.12.2010 16:26
ибо писать сценарий bash - мягко говоря "непонятно зачем"?

ну раз вы изучали bash, значит вам надо и писать на bash. А sort препод выбрал из-за того, что проверить просто.

Короче, переписывать вам мой скрипт на bash чуть выше который, и применять там нормальный алгоритм (я применил самый плохой. Смените его на простые вставки, а лучше на Шелла. Эти алгоритмы почти также просты.)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Сортировка по строкам

Сообщение NickLion »

drBatty, а Вы уверены, что препод поймёт такую сортировку? А то бывали случаи у знакомых :)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

NickLion писал(а):
25.12.2010 17:48
а Вы уверены, что препод поймёт такую сортировку? А то бывали случаи у знакомых :)

если даже не поймёт, то сделает вид что поймёт - она-же работает, это очевидно!

Кроме того, сортировка Шелла очень проста, дьявольски сложен её анализ и выбор частей для разделения. Однако анализа никто не просил, а как делить - сказано по ссылке. Я думаю, несколько ссылок на работы классиков только увеличат оценку. ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Kilik
Сообщения: 8

Re: Сортировка по строкам

Сообщение Kilik »

Спасибо огромное) Сейчас буду применять алгоритм на практике)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Сортировка по строкам

Сообщение SLEDopit »

drBatty писал(а):
25.12.2010 19:21
Я думаю, несколько ссылок на работы классиков только увеличат оценку. ;)
шесть точно не поставят (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Nazyvaemykh
Сообщения: 438
Статус: Подопытный участник

Re: Сортировка по строкам

Сообщение Nazyvaemykh »

Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.
¡ Страсть к разрушению есть творческая страсть!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Сортировка по строкам

Сообщение drBatty »

Nazyvaemykh писал(а):
25.12.2010 21:06
Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.

вы лучше на BrainFuck'е запишите, на хаскеле я и сам могу нагуглить.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Сортировка по строкам

Сообщение Ленивая Бестолочь »

Nazyvaemykh писал(а):
25.12.2010 21:06
Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.

да ладно, на C тоже в одну строку - сказали же qsort();
;-)
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Ответить