Сортировка по строкам
Модератор: Bizdelnick
Сортировка по строкам
Как можно отсортировать по строкам содержимое файла не используя команду sort? Есть мысли использовать grep в цикле. Но пока все безуспешно.
- serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
- Контактная информация:
Re: Сортировка по строкам
Используя какие средства? Python, Perl, awk, bash?.. В последнем случае, кажется, - никак, если не использовать альтернативу sort или не писать собственную функцию сортировки.
Re: Сортировка по строкам
Re: Сортировка по строкам
написать скрипт, который собственно выполняет сортировку одним из извесных алгоритмов.
Blog: hikki-tech
Re: Сортировка по строкам
Вопрос опять же заключается в том: можно ли это сделать средствами bash?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
с какой целью?
можно попробовать насоздавать кучу файлов, и вывести их командой ls. Более конструктивные мысли в голову не лезут.
MySQL
а чё?
можно!
сейчас напишу.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
Код: Выделить всё
#!/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
Спасибо сказали:
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
кстати, причём тут эхотаг?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
Kilik
нзч. чуть пальцы не сломал набирая ${a[$j]}, лучше выберите другой язык...
Да, здесь есть раздел про программирование и про командную строку. Или я писал этот скрипт в образовательных целях? "Так делать нельзя!"
Тогда ещё не хватает тестов на производительность... Они убедят любого, что использовать баш здесь == идиотизм. ;)
нзч. чуть пальцы не сломал набирая ${a[$j]}, лучше выберите другой язык...
Да, здесь есть раздел про программирование и про командную строку. Или я писал этот скрипт в образовательных целях? "Так делать нельзя!"
Тогда ещё не хватает тестов на производительность... Они убедят любого, что использовать баш здесь == идиотизм. ;)
Re: Сортировка по строкам
drBatty писал(а): ↑24.12.2010 20:54Kilik
нзч. чуть пальцы не сломал набирая ${a[$j]}, лучше выберите другой язык...
Да, здесь есть раздел про программирование и про командную строку. Или я писал этот скрипт в образовательных целях? "Так делать нельзя!"
Тогда ещё не хватает тестов на производительность... Они убедят любого, что использовать баш здесь == идиотизм.
Цели как раз таки образовательные) я и писал в соответствующей теме...просто была поставлена такая задача: отсортировать без sort. Прочитал документацию в интернете bash scripting guide и про всевозможное использование cat и grep. К логическому заключения не пришел. На чем собственно писать если не на Bash(я пользовался до этого только им, когда выполняли другие задачи, например, обычная сортировка)? sqlite мне кажется в моем случае не лучшее решение. Я просто осознал сейчас приведенный скрипт и сам себе задал вопрос: может не в том направлении я мыслю и мне дали это задание, чтобы я разобрался с другими средствами? Как вы думаете: если не bash - то какими средствами это сделать было бы логичнее? Администрирование Linux изучаем не так давно(изучали терминал и скрипты). Где можно что-то прочесть по данному вопросу? Или вы можете что-то посоветовать?
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
это не UnixWay. Не наш путь. У нас принято, что для каждой задачи есть специальная утилита, которая только её(задачу) и выполняет. Но делает это хорошо. Например для разного рода сортировок есть sort, для обработки текстов (автоматической, не ручной) есть sed, для фильтрации некоторых подстрок есть grep, а для сравнения текстов есть diff. Для связи этого всего в единое целое (если задача разбивается на под-задачи) есть bash.
В принципе, все эти утилиты могут выполнять и другую работу, можно сортировать на bash'е, писать скрипты в sed'е... Только это не наш путь - получается ерунда (хотя и занимательная - одна девушка написала тетрис на sed).
ну я-бы взял чистый С, с qsort() (man 3 qsort), там всего 10-20 строчек надо (прочитать файл, записать файл). кто-то другой - свой любимый ЯП.
Re: Сортировка по строкам
Заранее извиняюсь за некоторое злорадство и за то что не по теме. За 1 минуту нашел как это сделать в Windows PowerShell, с подробными описаниями на русском!
Вот те и рассуждения, какая убогая командная строка в вЕнде
Вот те и рассуждения, какая убогая командная строка в вЕнде
Re: Сортировка по строкам
reg123, это к чему? sort и в GNU/Linux есть. Вопрос стоял как это сделать через ж, не используя sort.
PS PowerShell не так уж плох, хотя опять в МС всё усложняют из-за оперирования объектами, а не просто текстовый поток.
PPS консоль в винде (как сам эмулятор терминала) таки ужасная
PS PowerShell не так уж плох, хотя опять в МС всё усложняют из-за оперирования объектами, а не просто текстовый поток.
PPS консоль в винде (как сам эмулятор терминала) таки ужасная
Re: Сортировка по строкам
NickLion
Хм, да я не про sort. Я понял смысл задачи. Я про внутреннюю справку по powershell с хорошим поиском. И отсортировал я не sort-ом, кстати.
Хм, да я не про sort. Я понял смысл задачи. Я про внутреннюю справку по powershell с хорошим поиском. И отсортировал я не sort-ом, кстати.
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
дык я и пишу - это не UNIX-Way. Такое может придти в голову только лишь пользователю Windows. Вопрос из серии:
- Как забить гвоздь отвёрткой?! (без молотка).
Я думаю, опытный столяр вас пошлёт подальше ну может и забьёт конечно, за очень дополнительные $$$. Или что-бы показать свою крутизну (ну как я - дескать и такая отвёртка у меня есть!), но это не лучшая идея.
там не только сам shell убогий, но и всё остальное - была-бы у них нормальная sort, не занимались-бы ерундой. Видать у них какой-то кривой молоток, если в сети можно за 1 секунду найти ман по забиванию гвоздей отвёрткой
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
меня давно занимает вопрос: как найти в вендовой справке слово time? Только не просто time, а ПРОСТО \<time\> ? А вот тут давеча на лоре спор был - сколько раз в справке упомянуто слово "директория"? Я получил ответ за пару минут, причём без гугла. И это очень простые запросы, из тех, которыми я мучаю свою встроенную справку... Поиск в вендовой справке намного хуже, просто он простой, тупой, и примитивный. Потому и освоить проще.
Re: Сортировка по строкам
Т.е. если я пишу на Си:
И запускаю это как скрипт из shell(ну тупо открываю его) - оно должно нормально работать? Что-то как-то не очень(на windows visual вроде как работает - проверял). На Linux ничего(путь даже прописывал полный).
Не думаю что от меня хотят кода на Си(или другого языка программирования). Мы использовали только shell и изучали возможности сценариев Bash. При чем тут Си я не знаю(не по материалу пройденному)... И вообще как-то странно "сортировать строки без sort". Я просто в тупике - на данном этапе читаю Алексея Береснева 2-издание "Администрирование GNU/Linux с нуля" - пока ничего полезного по этой теме не подчеркнул.
Вы считаете что самое логичное(и практичное) написать на любом ЯП(предпочтительнее Си) ибо писать сценарий bash - мягко говоря "непонятно зачем"?
Код: Выделить всё
#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: Сортировка по строкам
1) BUFSIZ что такое?
2) много ещё всякого... :(
Но идея именно такова.
предпочтительнее - не С, а тот, который вы хорошо знаете. Например можно на 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(), потому не стОит придумывать велосипед.
ну раз вы изучали bash, значит вам надо и писать на bash. А sort препод выбрал из-за того, что проверить просто.
Короче, переписывать вам мой скрипт на bash чуть выше который, и применять там нормальный алгоритм (я применил самый плохой. Смените его на простые вставки, а лучше на Шелла. Эти алгоритмы почти также просты.)
Re: Сортировка по строкам
drBatty, а Вы уверены, что препод поймёт такую сортировку? А то бывали случаи у знакомых :)
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
если даже не поймёт, то сделает вид что поймёт - она-же работает, это очевидно!
Кроме того, сортировка Шелла очень проста, дьявольски сложен её анализ и выбор частей для разделения. Однако анализа никто не просил, а как делить - сказано по ссылке. Я думаю, несколько ссылок на работы классиков только увеличат оценку. ;)
Re: Сортировка по строкам
Спасибо огромное) Сейчас буду применять алгоритм на практике)
Re: Сортировка по строкам
шесть точно не поставят (:
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.
The more you believe you don't do mistakes, the more bugs are in your code.
- Nazyvaemykh
- Сообщения: 438
- Статус: Подопытный участник
Re: Сортировка по строкам
Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.
¡ Страсть к разрушению есть творческая страсть!
- drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
- Контактная информация:
Re: Сортировка по строкам
Nazyvaemykh писал(а): ↑25.12.2010 21:06Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.
вы лучше на BrainFuck'е запишите, на хаскеле я и сам могу нагуглить.
- Ленивая Бестолочь
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Сортировка по строкам
Nazyvaemykh писал(а): ↑25.12.2010 21:06Лучше всего функция быстрой сортировки записывается на языке haskell: в одну строчку.
да ладно, на C тоже в одну строку - сказали же qsort();
;-)
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.