awk sed bash (HP-UX shell)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

awk sed bash

Сообщение tmp13 »

Вообщем есть скрипт на bash есть
HP-UX на котором shell
test.txt:

Код: Выделить всё

aaa|4444
bbb|5555
cccc|6666

команда из (преведущих тем):

Код: Выделить всё

cat -n <(for (( i=1; i<=N; i++ )); do echo; done) test.txt | sed '1,'$N'd;s/^ *\([0-9]*\) */\1|/'

на что получаем
sh: Syntax error: `(' is not expected.


далее предополжим N=1455566 и файл переделываем командой:

Код: Выделить всё

cat -n test.txt |awk '{ sub($1, $1+'14345356'" "); print }'|sed 's/^ *\([0-9]*\)[[:space:]]*/\1|/'

получаем:

Код: Выделить всё

1|.43454e+07    sdfsdf|sdfdf|4
1|.43454e+07    sdfsf|asdfsdf|5

соотвестенно если выполнить:

Код: Выделить всё

awk '{ sub($1, $1+'14345356'" "); print }' test.txt

будет:

Код: Выделить всё

1.43454e+07 |sdfdf|4
1.43454e+07 |asdfsdf|5


это в + awk не любителям=)
но вот вопрос почему awk на UNIX такой ппц умный что решил сам мне число переделать оО!!??
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: awk sed bash

Сообщение drBatty »

tmp13 писал(а):
27.01.2010 19:48
но вот вопрос почему awk на UNIX такой ппц умный что решил сам мне число переделать оО!!??

насколько я понимаю, ответ как всегда в мане:
When a string must be converted to a number, the conversion is accomplished using strtod(3). A number is
converted to a string by using the value of CONVFMT as a format string for sprintf(3), with the numeric
value of the variable as the argument. However, even though all numbers in AWK are floating-point, inte-
gral values are always converted as integers. Thus, given
CONVFMT = "%2.2f"
a = 12
b = a ""
the variable b has a string value of "12" and not "12.00".
When operating in POSIX mode (such as with the --posix command line option), beware that locale settings
may interfere with the way decimal numbers are treated: the decimal separator of the numbers you are
feeding to gawk must conform to what your locale would expect, be it a comma (,) or a period (.).
Gawk performs comparisons as follows: If two variables are numeric, they are compared numerically. If
one value is numeric and the other has a string value that is a "numeric string," then comparisons are
also done numerically. Otherwise, the numeric value is converted to a string and a string comparison is
performed. Two strings are compared, of course, as strings.
Note that string constants, such as "57", are not numeric strings, they are string constants. The idea
of "numeric string" only applies to fields, getline input, FILENAME, ARGV elements, ENVIRON elements and
the elements of an array created by split() that are numeric strings. The basic idea is that user input,
and only user input, that looks numeric, should be treated that way.
Uninitialized variables have the numeric value 0 and the string value "" (the null, or empty, string).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: awk sed bash

Сообщение sash-kan »

tmp13 писал(а):
27.01.2010 19:48
sh: Syntax error: `(' is not expected.
видимо, вашему шеллу не нравится конструкция «<(...)». так что это у вас ни разу ни bash.

попробуйте этот фрагмент:
cat -n <(for (( i=1; i<=N; i++ )); do echo; done) test.txt
заменить на:
for (( i=1; i<=N; i++ )); do echo; done | cat - test.txt
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk sed bash

Сообщение tmp13 »

Код: Выделить всё

for (( i=1; i<=N; i++ )); do echo; done | cat - test.txt
sh: Syntax error: `((' is not expected.


я уже вместо for и while туда пытался ваще ни как..
видимо, вашему шеллу не нравится конструкция «<(...)». так что это у вас ни разу ни bash.

да сор у меня вечно напряг с запятыми=)
это не bash это просто sh=)
так же присутствует ksh и csh а bash блин поставить они не догадались... видимо не фиг в такой продвинутой платформе как HP-UX использовать что-то "новое"!

прочитал ссылку из мана... и что из этого следует??
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: awk sed bash

Сообщение drBatty »

tmp13 писал(а):
28.01.2010 13:59
прочитал ссылку из мана... и что из этого следует??

незнаю. там что-то про числа в awk.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk sed bash

Сообщение tmp13 »

незнаю. там что-то про числа в awk.

на сколько я искал в гугле из этого следует что-то непааанятное=)))))))
а именно использование printf для вывода в нормальном виде и какими то невнятными параметрами, переменными и т.д.

Код: Выделить всё

 n=0;(while [ $n -lt 5 ]; do n=`expr $n + 1`; echo; done; cat test.txt)|cat -n

ура блин!!!

*** только работает это блин два часа!!((( ибо этот while работает просто ппц как медленно!!
эт какой то ппц!(

народ у кого есть UNIX! проверьте плиз я чёт не понимаю мб конечно НО

Код: Выделить всё

 echo 12345670 | awk '{ printf "%i\n", $1+1000}'
12346670

Код: Выделить всё

echo 12345670 | awk '{ sub($1,$1+1000); printf "%i\n", $1 }'
12346700


в линухе ответ одинаковый... что я делаю не так???
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: awk sed bash

Сообщение t.t »

tmp13 писал(а):
28.01.2010 13:59

Код: Выделить всё

for (( i=1; i<=N; i++ )); do echo; done | cat - test.txt
sh: Syntax error: `((' is not expected.


я уже вместо for и while туда пытался ваще ни как..
видимо, вашему шеллу не нравится конструкция «<(...)». так что это у вас ни разу ни bash.

да сор у меня вечно напряг с запятыми=)
это не bash это просто sh=)
так же присутствует ksh и csh а bash блин поставить они не догадались... видимо не фиг в такой продвинутой платформе как HP-UX использовать что-то "новое"!
HP-UX -- это коммерческая система, там вообще ничего GNU-того не используется.

А зачем этот изврат с двойными скобками?

Код: Выделить всё

for i in `seq N`
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: awk sed bash

Сообщение drBatty »

tmp13 писал(а):
28.01.2010 14:57
ура блин!!!

*** только работает это блин два часа!!((( ибо этот while работает просто ппц как медленно!!
эт какой то ппц!(

почему всё это нельзя сделать внутри sed или awk?
туда-суда прыгать действительно очень долго. можно узнать в чём задача? (я уже и забыл)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk sed bash

Сообщение tmp13 »

задача добавить циферку!))) в test.txt т.е привести к виду
N=12345670

Код: Выделить всё

12345670|aaa|4444
12345671|bbb|5555
12345672|cccc|6666


изходя из переведущей темы на linux было 2 решения:
1.
cat -n <(for (( i=1; i<=$N; i++ )); do echo; done) test.txt | sed '1,'$N'd;s/^ *\([0-9]*\)[[:space:]]*/\1|/'

2.
cat -n test.txt| awk '{ sub($1, $1+'$N'" "); print }'|sed 's/^ *\([0-9]*\)[[:space:]]*/\1|/'


на данный момент результат на HP-UX:
1. Путём невероятного умственного напряжения=) первый вариант стал:
n=0;(while [ $n -lt 5 ]; do n=`expr $n + 1`; echo; done; cat test.txt)|cat -n
- на 2 часа
2. А фиг его знает зачатки переделывания начались с команды
echo 12345670 | awk '{ sub($1,$1+1000); printf "%i\n", $1 }'

в результате которой sub умело складывал как строки:
12346700

А зачем этот изврат с двойными скобками?
for i in `seq N`

пробывал это конструкция того же bash как и двойные скобки в HP-UX shell не пашет!(

cat klmn.sh

Код: Выделить всё

#!/bin/sh
for i in `seq 1 13`
do
        echo $i
done
exit 0;

Код: Выделить всё

./klmn.sh[2]: seq:  not found.


Решено путём гмм не моих мозговых усилий всё оказалось просто!)
если кому понадобится как нить напишу..
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: awk sed bash

Сообщение t.t »

tmp13 писал(а):
29.01.2010 16:36
А зачем этот изврат с двойными скобками?
for i in `seq N`
пробывал это конструкция того же bash как и двойные скобки в HP-UX shell не пашет!(

cat klmn.sh

Код: Выделить всё

#!/bin/sh
for i in `seq 1 13`
do
        echo $i
done
exit 0;

Код: Выделить всё

./klmn.sh[2]: seq:  not found.
Это не bash, а внешняя команда. Запамятовал, что в HP-UX её нет; мне казалось, я её даже там использовал.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: awk sed bash

Сообщение drBatty »

tmp13 писал(а):
29.01.2010 16:36
задача добавить циферку!))) в test.txt т.е привести к виду
N=12345670
Код
12345670|aaa|4444
12345671|bbb|5555
12345672|cccc|6666

пронумеровать не с начала?
да... задача не для sed :(
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk sed bash

Сообщение tmp13 »

возникла опять проблемма с awk который после милиона начинает писать цифры аля 1.00001е6
ппц какой то просто невыполнимая задача на HP-UX
пока что допёр только до:

Код: Выделить всё

N=100000;cat -n test|awk '{system("expr " $1 " + '$N'")}'

что я этим делать дальше не понятно.. и делать ли вообще с этим что-то, но по крайней мере в этом случае цифры внятные
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: awk sed bash

Сообщение drBatty »

tmp13 писал(а):
29.01.2010 20:25
что я этим делать дальше не понятно.. и делать ли вообще с этим что-то, но по крайней мере в этом случае цифры внятные

напишите на sed - я думаю скорости вам хватит:

Код: Выделить всё

     #!/usr/bin/sed -nf

     # Prime the pump on the first line
     x
     /^$/ s/^.*$/1/

     # Add the correct line number before the pattern
     G
     h

     # Format it and print it
     s/^/      /
     s/^ *\(......\)\n/\1  /p

     # Get the line number from hold space; add a zero
     # if we're going to add a digit on the next line
     g
     s/\n.*$//
     /^9*$/ s/^/0/

     # separate changing/unchanged digits with an x
     s/.9*$/x&/

     # keep changing digits in hold space
     h
     s/^.*x//
     y/0123456789/1234567890/
     x

     # keep unchanged digits in pattern space
     s/x.*$//

     # compose the new number, remove the newline implicitly added by G
     G
     s/\n//
     h

© info sed
это эмуляция cat -n
вы можете поменять /^$/ s/^.*$/1/ на нужный вам начальный номер, и убрать выравнивание:

Код: Выделить всё

     # Format it and print it
     s/^/      /
     s/^ *\(......\)\n/\1  /p
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
tmp13
Сообщения: 986
ОС: openSuse 11.2

Re: awk sed bash

Сообщение tmp13 »

=))
хотел сказать огромное спасибо sash-kan за команду из преведущей темы:

Код: Выделить всё

N=648
sed -n 'x; /^$/ s/^.*$/'$N'/; G; h; s/^\(.*\)\n/\1|/p; g; s/\n.*$//; /^9*$/ s/^/0/; s/.9*$/x&/; h; s/^.*x//; y/0123456789/1234567890/; x; s/x.*$//; G; s/\n//; h' file.txt


upd. да, турбореактивности явно не вышло. ну что ж, остаётся предыдущий вариант.

ну 1 файл 1 минута=) что более чем приемлемо=)
главное работает) и т.к времени в обрез то очень помогло=)
Красных бей и белых бей!
Вот вам иерархия!
Я люблю тебя за это, милая моя,
Разудалая, хмельная мать моя – Анархия!
Спасибо сказали: