The OpenNET Project / Index page

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

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

"округление в AWK"  +/
Сообщение от Евгений (??) on 29-Сен-13, 21:16 
Дано: на входе текстовый файл в котором идут девартовы координаты(особенность после целой части стоит точка даже если дробная часть отсутствует, точность 3 знака после запятой, незначащие нули в дробной части могут отсутствовать)
X1. Y2.
X4.2 Y3.123
Задача: согласно заданному уравнению (Z=sqrt(625-y^2) добавить третий столбец с вычисленной координатой Z
пример:
X1. Y2. Z24.92
X4.2 Y3.123 Z24.8
кривоработающий скрипт получился(с awk до этого не сильно приходилось сталкиваться), но вот округление не получается(маны курил до посинения, примеров просмотрел бесконечное множество -вроде все просто в баше округление работает, в AWK нет)
Собственно вот предполагаемый текст скрипта:
#!/bin/bash
LC_NUMERIC="POSIX"
inputfile=$1
outputfile=$2
>$outputfile

awk '{
           if ($NF~/Y./) {
                          t=substr($NF, 2)
                          NF=NF+1
                          t=sqrt(625-t^2)
                          $'NF'=$(printf "%3.3f\n", $'NF')
                          #$'NF'="Z-"t
                            }
       printf ("%3.3f\n", $0)
                     }' $inputfile
exit 0  

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

Оглавление

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


1. "округление в AWK"  +1 +/
Сообщение от михалыч (ok) on 30-Сен-13, 10:30 
Мазохизм и извращение какое-то с этими точками-запятыми в awk ))
Бр-р-р!.. Может я не умею его "готовить"? ))

awk '{if ($NF~/Y/) {t=substr($NF, 2); NF=NF+1; gsub(/\./, ",", t); z=sqrt(625-t^2); $NF=sprintf ("Z%.3f", z); gsub(",", "\.", $NF)} print $0}' input

X1. Y2. Z24.920
X4.2 Y3.123 Z24.804

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

2. "округление в AWK"  +/
Сообщение от Andrey Mitrofanov on 30-Сен-13, 12:53 
> Мазохизм и извращение какое-то с этими точками-запятыми в awk ))
> Бр-р-р!.. Может я не умею его "готовить"? ))

LANG=C awk '...'

Не поверишь,

   the POSIX standard requires this behavior

//man gawk писали враги позикса?!

Сейчас на 3ёх хостах попробовал. "Сломаны запятые" только на 1 - сам мучался с ним, поэтому знаю. При этом вывод locale<Enter> _одинаковый_.

>gsub(/\./, ",", t);
>gsub(",", "\.", $NF)

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

3. "округление в AWK"  +1 +/
Сообщение от михалыч (ok) on 30-Сен-13, 15:51 
> Не поверишь,

Верю! ))
>    the POSIX standard requires this behavior
> //man gawk писали враги позикса?!

не-не, друзья, однако!

Дык, у нас же на раёне фсё не как у фсех. (ну в FreeBSD ))
Тот же gawk в базовой комплектации отсутствует.
И знаешь где лежит?
Не поверишь,
в джапанес, во как!
/usr/ports/japanese/gawk/
Ставим и о-па-на! Случилось "чудо"!
Точки-запятые идут нафик и всё работает сразу как надо, прямо почти как из "каропки"!

gawk '{if ($NF~/Y/) {z=substr($NF, 2); NF=NF+1; z=sqrt(625-z^2); $NF=sprintf ("Z%.3f", z)} print}' input

X1. Y2. Z24.920
X4.2 Y3.123 Z24.804

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

4. "округление в AWK"  +/
Сообщение от Евгений (??) on 30-Сен-13, 23:20 
Огромное человеческое спасибо, Михалыч. Я просто с ног сбился пытаясь этот скрипт оживить.
Повторюсь ит приведу полный текст работающего скрипта(может кому пригодится или в образовательных целях):
#!/bin/bash
inputfile=$1
outputfile=$2
>$outputfile

awk '{
    if ($NF~/Y/) {
        z=substr($NF, 2);
        NF=NF+1;
        z=sqrt(625-z^2);
        $NF=sprintf ("Z%.3f", z)}
        print $0
        }' $inputfile
exit 0
P.S. Еще раз огромное спасибо Михалычу. Только строка в awk {print $0>$outputfile}' почему-то не работает, а awk {print $0>"/home/temp.txt"}' работает. И почему проблема точек/запятых/локали исчезла сама собой(без смены локали, танцев с бубном, переустановки awk). У меня Ubuntu 12, awk в базовой комплектации отсутствовала.

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

5. "округление в AWK"  +/
Сообщение от михалыч (ok) on 01-Окт-13, 11:26 
Не совсем понял, возможно нужно это?

inputfile=$1
outputfile=$2

awk -v out=$outputfile '{
    if ($NF~/Y/) {
        z=substr($NF, 2);
        NF=NF+1;
        z=sqrt(625-z^2);
        $NF=sprintf ("Z%.3f", z)}
        print > out
        }' $inputfile
exit 0

Запускаем ./test.sh input output (input разумеется существует) получаем файл output

Но так проще
awk '{
    if ($NF~/Y/) {
        z=substr($NF, 2);
        NF=NF+1;
        z=sqrt(625-z^2);
        $NF=sprintf ("Z%.3f", z)}
        print
        }' $1 > $2
exit 0

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

6. "округление в AWK"  +/
Сообщение от Евгений (??) on 01-Окт-13, 14:10 
а export переменной в сабшелл тут не сработает?

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

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

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




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

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