На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> вопрос по sed
    Можно ли при помощи sed решить следующую задачу
    есть файл, в котором два столбца вида
    char1 value1
    char1 value2
    char1 value3
    char2 value4
    char3 value5
    и т.д
    нужно посчитать для каждого char сумму всех value и вывести в файл
      кажется, что sed тут не помощник, но вот awk может помочь
      ExpandedWrap disabled
        $ cat file.txt
        a 1
        b 2
        a 4
        c 5
        b 5
        $ cat file.txt | awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}'
        a 5
        b 7
        c 5
        Цитата XandoX @
        awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}'

        Спасибо, работает, сортировка только нарушилась, но это поправимо!
          Цитата XandoX @
          кажется, что sed тут не помощник, но вот awk может помочь
          ExpandedWrap disabled
            $ cat file.txt
            a 1
            b 2
            a 4
            c 5
            b 5
            $ cat file.txt | awk '{S[$1]+=$2}END{for(c in S){print c, S[c]}}'
            a 5
            b 7
            c 5

          Что-то не могу совладать с awk...
          А как вывести еще и кол-во повторений элементов первого столбца ? То есть сколько раз повторяется $1 ?
          Сообщение отредактировано: andyics -
            Цитата andyics @
            А как вывести кол-во повторений элементов первого столбца ? То есть сколько раз повторяется $1 ?

            ExpandedWrap disabled
              $ cat file.txt | awk '{C[$1] += 1}END{for (i in C) { print i, C[i]}}'
              a 2
              b 2
              c 1
              Цитата XandoX @

              Большое спасибо, все работает!!!
                Есть файл в шестой строке цифры от 0 до 9
                Нужно просто вывести цифру 9 на экран, если она там есть
                конструкция head -n6|tail -n1| sed 's/\(.*\)\(9\)\(.*)\/\2/'
                выводит на экран 9, если она есть в строке, если же ее нет, то печатается вся строка целиком. Что нужно поменять, чтобы в случае отсутствия цифры 9 выводилось, например 0 ?
                  Что за странная любовь к sed?
                  используй grep
                  ExpandedWrap disabled
                    ➜  /tmp  cat test.txt
                    sdfsdf jskdf 9
                    skjhsdfjk sdf
                    ➜  /tmp  cat test.txt | head -n 1 | tail -n 1 | grep -q 9 && echo 'yes' || echo 'no'
                    yes
                    ➜  /tmp  cat test.txt | head -n 2 | tail -n 1 | grep -q 9 && echo 'yes' || echo 'no'
                    no
                    Цитата XandoX @

                    Ну с grepom все ясно, а sed все-таки? Тем более, что потом нужно искать определенное положение символа в строке и sed тут в самый раз...
                      Никаких "потом". Все надо делать в один проход. Если алгоритм этого не может, тогда:
                      1) обработать оригинальные файлы на предмет 9.
                      2) преобразовать оригинальные файлы, ликвидировав 9 (что это будет, либо s/\(.*\)\(9\)\(.*)\/\1\3/, либо s/\(.*\)\(9\)\(.*)\/\10\3/, решите сами).
                      3) делать "потом" на модифицированных данных.
                        Кстати, конструкция, объявленная как работающая, будет работать только с одной девяткой. Если их много, то устранить их вышеприведенными примерами паттернов RE не удастся.

                        Так что все завязано на домене допустимых значений для строки 6. Тут Вам виднее что там может быть.
                          Ребята, "откройте" для себя Perl :lol: Любые манипуляции с любым текстом сведены к минимуму. Perl - де факто есть в любой *nix системе. Сформулируйте конечное задание - сделаю скрипт.
                            Есть файл в котором три столбца. Проиндексирован по первым двум.
                            конструкция вида
                            awk '{n[$3]+=1}END{for c in n){print c,n[c]}}
                            позволяет посчитать кол-во значений в третьем столбце.
                            А как при этом вывести, например еще первое и последнее значение по второму полю ??
                              Отвечаю сам себе.
                              Оказывается, массив n[$3 "" $2] решает на 90% задачу...
                                Цитата andyics @
                                Оказывается, массив n[$3 "" $2] решает на 90% задачу...


                                Вот код на Перле, который решает на 100% задачу (если я ее правильно понял):
                                ExpandedWrap disabled
                                  #!/usr/bin/perl
                                   
                                  # пусть @A - матрица с содержимым:
                                   
                                  #      1    ss   ff
                                  #      22  xxx   ff
                                  #      333 sss aaaa
                                   
                                  push @A , "  1   ss   ff";
                                  push @A , " 22  xxx   ff";
                                  push @A , "333  sss aaaa";
                                   
                                  # Но, если хотим обработать текстовой файл с помощью perl script.pl < текст.txt,
                                  # раскоментируем следующую строку
                                  # @A = <STDIN>;
                                   
                                  map {
                                    @X = split(" ",$_);
                                    $C1{$X[2]} = ".";
                                    $C2{$X[1]} = ".";
                                  } @A;
                                   
                                  @C2 = sort(keys(%C2));
                                   
                                  print "Количество уникальных значений по третьему столбцу: ".scalar(keys(%C1))."\n";
                                  print "Минимальное значение по второму столбцу: ".((scalar(@C2)>0) ? $C2[0] : "нет")."\n";
                                  print "Максимальное значение по второму столбцу: ".((scalar(@C2)>0) ? $C2[scalar(@C2)-1] : "нет")."\n";


                                Тут онлайн-выполнение.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0416 ]   [ 16 queries used ]   [ Generated: 28.03.24, 14:28 GMT ]