The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  вход/выход  слежка  RSS
"Создать скрипт помогите"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Создать скрипт помогите"  –1 +/
Сообщение от pilotik email(ok) on 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


Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Создать скрипт помогите"  +/
Сообщение от universite (ok) on 17-Янв-17, 22:39 
> Есть файл следующего содержания
> 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Создать скрипт помогите"  +/
Сообщение от pilotik email(ok) on 18-Янв-17, 01:41 
> 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

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


Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Создать скрипт помогите"  +/
Сообщение от Аноним (??) on 18-Янв-17, 09:08 
> Пробовал баш+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 не сильно отличается.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Создать скрипт помогите"  +/
Сообщение от михалыч (ok) on 18-Янв-17, 16:50 
> Ух ёлы-палы, вот ведь изврат.

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

использование 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 от ТС будет?  

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Создать скрипт помогите"  +/
Сообщение от Andrey Mitrofanov on 19-Янв-17, 14:35 
> использование 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"...

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

9. "Создать скрипт помогите"  +/
Сообщение от Аноним (??) on 20-Янв-17, 09:22 
> твой вариант, безусловно изящней
> 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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "Создать скрипт помогите"  +/
Сообщение от Andrey Mitrofanov on 20-Янв-17, 14: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
> а я в очередной раз убеждаюсь в мастерстве мэтра ))

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

12. "Создать скрипт помогите"  +1 +/
Сообщение от михалыч (ok) on 22-Янв-17, 03:03 
> Сам пару лет искал на сервере -- откуда там русская локаль (с
> аналогичными проблемами в результате). Пока не выяснил, что с моего десктопчика
> по 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."

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

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

11. "Создать скрипт помогите"  +/
Сообщение от universite (ok) on 20-Янв-17, 23:24 

> твой вариант, безусловно изящней
> 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
> я там про точки/запятые писал (да гранаты у меня не той системы
> - ось фря ))))

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

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

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

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

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

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

6. "Создать скрипт помогите"  +/
Сообщение от Andrey Mitrofanov on 19-Янв-17, 14:38 
>> Ух ёлы-палы, вот ведь изврат.
> да уж, там с этими точками/запятыми реально изврат
> использование 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:~$ _

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

15. "Создать скрипт помогите"  +/
Сообщение от pilotik (ok) on 26-Янв-17, 01:52 
Ну вы ребят даёте. Спасибо всем.


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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