Есть файл следующего содержания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
> Есть файл следующего содержания
> 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.000000man expr
man bc
man printfдля особых ценителей возможно на awk
> 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а дальше не соображу
> Пробовал баш+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 не сильно отличается.
> Ух ёлы-палы, вот ведь изврат.да уж, там с этими точками/запятыми реально изврат
использование 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 от ТС будет?
> использование 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"...
да ладно, чего там, можно и на "ты"!
про обратную связь - это я, конечно, погорячился, ляпнул не подумав ))вариант анонима
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 получается а-ля awkperl -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а я в очередной раз убеждаюсь в мастерстве мэтра ))
> твой вариант, безусловно изящней
> 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
>[оверквотинг удален]
> 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,333333mawk, оказавшийся под рукой, даже такого выбора не предоставляет, видимо, и просто всегда пишет точку. И "нарушает позикс".
> и в perl сразу с точками, кстати с ключиком -a получается а-ля
> awk
> а я в очередной раз убеждаюсь в мастерстве мэтра ))
> Сам пару лет искал на сервере -- откуда там русская локаль (с
> аналогичными проблемами в результате). Пока не выяснил, что с моего десктопчика
> по 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."о-о-о-о!
а вот это просто замечательно! шикарная подсказка
> твой вариант, безусловно изящней
> 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
> я там про точки/запятые писал (да гранаты у меня не той системы
> - ось фря ))))Благодарю, забрал в примеры.
> Благодарю, забрал в примеры.это не ко мне ))
Andrey и аноним авторы, а я их решения на perl переписал
но мы же чтим копирайты, страна должна знать своих героев!
>> Благодарю, забрал в примеры.
> это не ко мне ))
> Andrey и аноним авторы, а я их решения на perl переписал
> но мы же чтим копирайты, страна должна знать своих героев!Я всё думал, что меня смущает в поминании копирайтов в этом контексте. Вот сформулировал. Приём использования awk-а, который я показал, как и обмен способами применения др.инструментов -- это обмен знаниями. Не надо знания копирайтить. И патентовать не надо.
На копирайты букваря ж мы не ссылемся, когда пишем сообщения сюда. Да, мне льстит признание коллегами моего мастерства, но и у вас я тоже учусь. Но копирайты (или даже патенты) на методы (выжатые в однострочные примеры!) применения инструментов моего ремесла -- Столмана с Кнутом на вас ;) нет.
(никакого отношения к топикстартеру и его задаче)
>> Ух ёлы-палы, вот ведь изврат.
> да уж, там с этими точками/запятыми реально изврат
> использование 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:~$ _
Ну вы ребят даёте. Спасибо всем.
> Пробовал баш+awk для одной переменной
> cat "$file" | while read line;
> а дальше не соображуПробуй для трех переменных
cat "$file" | while read first second rest;