The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Создать скрипт помогите, !*! pilotik, 17-Янв-17, 14:46  [смотреть все]
Есть файл следующего содержания

5.000000 90.000000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
10.000000 90.000000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

есть переменные x = 20.2 и у =30.3.
необходимо найти первое и второе слово в строке и сложить с переменными
в итоге должны получить файл

25.200000 120.300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
30.200000 120.300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000


  • Создать скрипт помогите, !*! universite, 22:39 , 17-Янв-17 (1)
    > Есть файл следующего содержания
    > 5.000000 90.000000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
    > 10.000000 90.000000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
    > есть переменные x = 20.2 и у =30.3.
    > необходимо найти первое и второе слово в строке и сложить с переменными
    > в итоге должны получить файл
    > 25.200000 120.300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
    > 30.200000 120.300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

    man expr
    man bc
    man printf

    для особых ценителей возможно на awk

    • Создать скрипт помогите, !*! pilotik, 01:41 , 18-Янв-17 (2)
      > man expr
      > man bc
      > man printf
      > для особых ценителей возможно на awk

      Пробовал баш+awk для одной переменной
      #!/bin/bash
      file=./filename.txt
      cat "$file" | while read line;
      do
      echo "$line" | awk '{xc = 20.2000; a=$1+xc; print a}'
      done

      а дальше не соображу


      • Создать скрипт помогите, !*! Аноним, 09:08 , 18-Янв-17 (3)
        > Пробовал баш+awk для одной переменной
        > #!/bin/bash
        > file=./filename.txt
        > cat "$file" | while read line;
        > do
        > echo "$line" | awk '{xc = 20.2000; a=$1+xc; print a}'
        > done
        > а дальше не соображу

        Ух ёлы-палы, вот ведь изврат.
        А что-нибудь типа вот такого:

        #!/usr/bin/sh
        awk '{
                $1 += 20.2
                $2 += 30.3
                printf "%f %f%s\n",$1, $2, substr($0, length($1) + length($2) + 2, length($0))
        }' "$*"

        А потом запускать
        ./prog.sh in_file > out_file

        Проверял в Unix, но думаю GNU/Linux awk не сильно отличается.

        • Создать скрипт помогите, !*! михалыч, 16:50 , 18-Янв-17 (4)
          > Ух ёлы-палы, вот ведь изврат.

          да уж, там с этими точками/запятыми реально изврат

          использование substr в awk натолкнуло меня на мысль порезать строку и взять то что нужно/осталось

          perl -ane 's/(?:\d+\.\d+\s){2}//; $x=20.2; $y=30.3; printf "%f %f %s", $F[0]+=$x, $F[1]+=$y, $_' file

          или ТС на чистом sh/bash нужно? feedback от ТС будет?  

          • Создать скрипт помогите, !*! Andrey Mitrofanov, 14:35 , 19-Янв-17 (5)
            > использование substr в awk натолкнуло меня на мысль порезать строку и взять
            > то что нужно/осталось
            >
            perl -ane 's/(?:\d+\.\d+\s){2}//; $x=20.2; $y=30.3; printf "%f %f %s", $F[0]+=$x, 
            > $F[1]+=$y, $_' file

            Это всё неправильно! %) Не смотри на него. Надо так (не, целиком не буду):

            awk '{$1=sprintf("...",$1+VAL1); $2=sprintf("...",$1+VAL2); print}

            > или ТС на чистом sh/bash нужно? feedback от ТС будет?

            Если бы у бабушки была постановка задачи, она была бы дедушкой. А Вы "feedback"...

            • Создать скрипт помогите, !*! михалыч, 18:52 , 19-Янв-17 (7)
              да ладно, чего там, можно и на "ты"!
              про обратную связь - это я, конечно, погорячился, ляпнул не подумав ))

              вариант анонима

              awk '{$1+=20.2; $2+=30.3; printf "%f %f %s\n", $1, $2, substr($0, length($1)+length($2)+3, length($0))}' file

              25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
              30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000


              твой вариант, безусловно изящней

              awk '{$1=sprintf("%f",$1+20.2); $2=sprintf("%f",$2+30.3); print}' file

              25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
              30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

              я там про точки/запятые писал (да гранаты у меня не той системы - ось фря ))))

              и чтобы были точки вместо запятых, приходится перед awk делать setenv "LC_NUMERIC=C" или export LC_NUMERIC=C

              а хочется иногда странного, чтобы безо всяких экспортов,
              и в perl сразу с точками, кстати с ключиком -a получается а-ля awk

              perl -ane '$x=20.2; $y=30.3; $F[0]=sprintf("%f",$F[0]+$x); $F[1]=sprintf("%f",$F[1]+$y); print join(" ", @F),"\n";' file

              25.200000 120.300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
              30.200000 120.300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

              а я в очередной раз убеждаюсь в мастерстве мэтра ))

              • Создать скрипт помогите, !*! Аноним, 09:22 , 20-Янв-17 (9)
                > твой вариант, безусловно изящней
                > awk '{$1=sprintf("%f",$1+20.2); $2=sprintf("%f",$2+30.3); print}' file
                > 25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > 30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

                Да, классно выглядит.

                > я там про точки/запятые писал (да гранаты у меня не той системы
                > - ось фря ))))

                А я то думал, что не так с точками (проверял на HP-UX)

                > и чтобы были точки вместо запятых, приходится перед awk делать setenv "LC_NUMERIC=C"
                > или export LC_NUMERIC=C

              • Создать скрипт помогите, !*! Andrey Mitrofanov, 14:10 , 20-Янв-17 (10)
                >[оверквотинг удален]
                > awk '{$1+=20.2; $2+=30.3; printf "%f %f %s\n", $1, $2, substr($0, length($1)+length($2)+3,
                > length($0))}' file
                > 25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > 30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > твой вариант, безусловно изящней
                > awk '{$1=sprintf("%f",$1+20.2); $2=sprintf("%f",$2+30.3); print}' file
                > 25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > 30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > я там про точки/запятые писал (да гранаты у меня не той системы
                > - ось фря ))))

                Сам пару лет искал на сервере -- откуда там русская локаль (с аналогичными проблемами в результате). Пока не выяснил, что с моего десктопчика по ssh! :))))

                > и чтобы были точки вместо запятых, приходится перед awk делать setenv "LC_NUMERIC=C"
                > или export LC_NUMERIC=C

                В пределе, |LANG= awk '{...}'.

                Обнаружил в gawk(1) чудеса стандартизации: "Although the POSIX standard requires this behavior, and gawk does so when --posix is in effect, the default is  to  follow  traditional behavior  and use a period as the decimal point, even in locales where the period is not the decimal point  character."

                user:~$ awk 'BEGIN{print 1/3}'
                0.333333
                user:~$ awk -N 'BEGIN{print 1/3}'
                0,333333

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

                > и в perl сразу с точками, кстати с ключиком -a получается а-ля
                > awk
                > а я в очередной раз убеждаюсь в мастерстве мэтра ))

                • Создать скрипт помогите, !*! михалыч, 03:03 , 22-Янв-17 (12) +1
                  > Сам пару лет искал на сервере -- откуда там русская локаль (с
                  > аналогичными проблемами в результате). Пока не выяснил, что с моего десктопчика
                  > по ssh! :))))

                  вот и у меня так же! ты открыл мне глаза )))

                  > Обнаружил в gawk(1) чудеса стандартизации: "Although the POSIX standard requires this
                  > behavior, and gawk does so when --posix is in effect, the
                  > default is  to  follow  traditional behavior  and
                  > use a period as the decimal point, even in locales where
                  > the period is not the decimal point  character."

                  о-о-о-о!
                  а вот это просто замечательно! шикарная подсказка

              • Создать скрипт помогите, !*! universite, 23:24 , 20-Янв-17 (11)

                > твой вариант, безусловно изящней
                > awk '{$1=sprintf("%f",$1+20.2); $2=sprintf("%f",$2+30.3); print}' file
                > 25,200000 120,300000 0.144003 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > 30,200000 120,300000 0.001848 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
                > я там про точки/запятые писал (да гранаты у меня не той системы
                > - ось фря ))))

                Благодарю, забрал в примеры.

                • Создать скрипт помогите, !*! михалыч, 03:12 , 22-Янв-17 (13)
                  > Благодарю, забрал в примеры.

                  это не ко мне ))
                  Andrey и аноним авторы, а я их решения на perl переписал
                  но мы же чтим копирайты, страна должна знать своих героев!

                  • Создать метод, !*! Andrey Mitrofanov, 09:33 , 23-Янв-17 (14)
                    >> Благодарю, забрал в примеры.
                    > это не ко мне ))
                    > Andrey и аноним авторы, а я их решения на perl переписал
                    > но мы же чтим копирайты, страна должна знать своих героев!

                    Я всё думал, что меня смущает в поминании копирайтов в этом контексте. Вот сформулировал. Приём использования awk-а, который я показал, как и обмен способами применения др.инструментов -- это обмен знаниями. Не надо знания копирайтить. И патентовать не надо.

                    На копирайты букваря ж мы не ссылемся, когда пишем сообщения сюда. Да, мне льстит признание коллегами моего мастерства, но и у вас я тоже учусь. Но копирайты (или даже патенты) на методы (выжатые в однострочные примеры!) применения инструментов моего ремесла -- Столмана с Кнутом на вас ;) нет.

                    (никакого отношения к топикстартеру и его задаче)

          • Создать скрипт помогите, !*! Andrey Mitrofanov, 14:38 , 19-Янв-17 (6)
            >> Ух ёлы-палы, вот ведь изврат.
            > да уж, там с этими точками/запятыми реально изврат
            > использование substr в awk натолкнуло меня на мысль порезать строку и взять
            > то что нужно/осталось

            В смысле, в awk делаем так:

            user:~$ seq 25 |xargs -n5
            1 2 3 4 5
            6 7 8 9 10
            11 12 13 14 15
            16 17 18 19 20
            21 22 23 24 25
            user:~$ seq 25 |xargs -n5 |awk '{$1=$1+2222; $2=$2+1000000; print}'
            2223 1000002 3 4 5
            2228 1000007 8 9 10
            2233 1000012 13 14 15
            2238 1000017 18 19 20
            2243 1000022 23 24 25
            user:~$ _

      • Создать скрипт помогите, !*! DeadLoco, 03:25 , 20-Янв-17 (8)
        > Пробовал баш+awk для одной переменной
        > cat "$file" | while read line;
        > а дальше не соображу

        Пробуй для трех переменных

        cat "$file" | while read first second rest; 




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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