Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > все символы в файле - bash


Автор: Larrr 10.2.2006, 10:43
Задача - написать скрипт в bash, который бы находил все различные символы файла. Пока что имеется следующий вариант

cat c.txt | ( x=0; while read lin; do echo "$lin" >> temp.txt ; x=`expr $x + 1` ; \
if [ $x -gt 100 ]; then cat temp.txt | sed 's/\(.\)/\1\n/g' | sort | uniq | \
perl -e 'while(<>){ $_ =~ s/\s*$//; print $_ ; }' > temp.txt ; fi ; done ; \
cat temp.txt | sed 's/\(.\)/\1\n/g' | sort | uniq | perl -e \
'while(<>){ $_ =~ s/\s*$//; print $_ ; }' )

который работает медленно, неефективно и к тому же совершенно непрозрачно написанный.

Есть у кого-нибудь идеи, как его сделать быстрым, эффективным и красивым? smile

Автор: bilbobagginz 10.2.2006, 11:20
  • я не понял задачу.
  • для начала сформатируй скрпт при помощи "каретки" и тега "Код", изпользуй синтаксис перла.
    а потом мы его прочитаем без вывиха роговичной мышцы smile
    ( если ты хочешь сделать очень длинную строку, но визуально раздробить ее, это делается посредством вставки "\", новой строки, и табулятора. после этого можно продолжать ту же строку)
    пример:
    Код

    # данное предложение:
    command1 \
    <tab>--flag1=value1\
    <tab>--flag2=value2;\
    <tab>command2 --flag3=value3
    # эквивалентно следующему:
    command1 --flag1=value1 --flag2=value2; command2 --flag3=value3
  • данное тобой решение - вовсе не баш, тут используются perl, sed.


пока.

Автор: Larrr 10.2.2006, 14:51
2bilbobagginz

1/ есть файл, в нем содержатся символы, например aaabbc - на выход надо подать a b c, то есть все символы, которые встретились в данном файле хотя бы однажды

2/ я несколько запутанно объяснила цель, прошу прощения - цель не исправить предложенный код, а предложить что-то другое.

3/буду внимательнее к терминологии, спасибо smile

Автор: bilbobagginz 10.2.2006, 16:14
ок, теперь есть сомнения другого рода:
насколько мне понятно теперь, это домашка.. я правильно понимаю ?
если нет:
скажи что ты попробовала и что же вышло, и дальше пойдем думать в чем же проблема.
для начала хотелось бы знать
  • что за файлы придется скрипту обрабатывать ( какой величины )
  • все ли символы будут там встречаться
  • нужно ли экономить нагрузку на диск или процессор

а если же ДА, то этой домашке здесь не место, и мы ее перенесем.



Автор: Larrr 10.2.2006, 19:28
нет, это не домашка
задачу я решаю потому, что мне надо как-то учиться программировать в линуксах - я придумываю задачи и пытаюсь их решать
эта задача тоже взята с потолка, поэтому в ней могут быть непонятки smile
Отвечаю на вопросы
-файлы содержащие текст + возможны какие-то дополнительные символы а-ля ?^#
-размер текстового файла ограничим 1Мб(в формате .txt)
-желательно экономить, но необязательно

Автор: bilbobagginz 11.2.2006, 01:42
а решения обязательно должно быть написано на bash ?!


Автор: Larrr 11.2.2006, 12:10
немного bash, немного sed, немного awk, немного perl - это все что я знаю smile . Так что можно использовать любой из них.

Автор: MAKCim 11.2.2006, 12:49
Код

#!/usr/bin/perl

if (@ARGV==1)
{
    open(MFILE,$ARGV[0]);
    @list=();
    $space=' ';
    while (<MFILE>)
    {
        @string=split('');
        foreach $i (@string)
        {
            $j=0;
            while ($j<@list && $i ne $list[$j]) {$j++;}
            if ($j==@list && $i ne $space) {push(@list,$i);}
        }
    }
    close(FILE);
    print @list;
}
else {print "Incorrect path!";}

поиск примитивный, скорее всего долгий при больших размерах файла, но зато понятный алгоритм smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)