The OpenNET Project / Index page

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



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

"вернуть значение из awk"  +/
Сообщение от d2e8k7 (ok), 11-Окт-19, 09:48 
Добрый день!
можно ли вернуть значение из awk в запускающий его shell-скрипт ?

z1=$(awk '{print $5}' file) не подходит, потому что

awk-скрипт парсит файл, выводит строки по некоторым условиям и считает количество выведенных строк.
Значение количества строк хотелось бы вернуть в sh, чтобы использовать в другом awk.

Благодарю откликнувшихся.

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

Оглавление

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

1. "вернуть значение из awk"  +1 +/
Сообщение от Andrey Mitrofanov_N0 (??), 11-Окт-19, 09:54 
> z1=$(awk '{print $5}' file) не подходит, потому что
> Значение количества строк хотелось бы вернуть в sh, чтобы

z1=$(awk 'END{print NR}' file)

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

2. "вернуть значение из awk"  +/
Сообщение от d2e8k7 (ok), 11-Окт-19, 11:26 
Скрипт он на самом деле несколько сложнее. Примерно такой:
#/bin/sh
...
awk '{
  if(condition) {
    arr=arr "\n\t " $1 " " $2 " " $3 " " $4 "; <-- тут еще др данные выбираются
    count++;
  }
}
END{
   print count;
   print arr;
}' file > output.txt
..
awk '{}'  <-- След. awk парсит другой файл. Сюда бы я хотел передать count
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "вернуть значение из awk"  +/
Сообщение от Andrey Mitrofanov_N0 (??), 11-Окт-19, 13:39 
>[оверквотинг удален]
>     count++;
>   }
> }
> END{
>    print count;
>    print arr;
> }' file > output.txt
> ..
> awk '{}'  <-- След. awk парсит другой файл. Сюда бы я
> хотел передать count

awk 'ARGIND==1{count=$0;nextfile} {....}' output.txt ...

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

4. "вернуть значение из awk"  +/
Сообщение от d2e8k7 (ok), 11-Окт-19, 14:03 
>[оверквотинг удален]
>>   }
>> }
>> END{
>>    print count;
>>    print arr;
>> }' file > output.txt
>> ..
>> awk '{}'  <-- След. awk парсит другой файл. Сюда бы я
>> хотел передать count
> awk 'ARGIND==1{count=$0;nextfile} {....}' output.txt ...

Если я правильно понял, Вы советуете обрабатывать файлы одним и тем же awk-скриптом
Но у меня входные файлы имеют разную структуру, поэтому и awk-скрипты для них разные.
Есть ли у awk возможность возвращать значение? ENVIRON, как я понял, не может изменить
значение переменной окружения, упомянутый в первом сообщении способ не подходит... Получается никак не вернуть? :(

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

5. "вернуть значение из awk"  +/
Сообщение от Аноним (5), 11-Окт-19, 17:59 
> z1=$(awk '{print $5}' file) не подходит, потому что
> awk-скрипт парсит файл, выводит строки по некоторым условиям и считает количество выведенных
> строк.
> Значение количества строк хотелось бы вернуть в sh, чтобы использовать в другом
> awk.

Вы заблуждаетесь. Отлично все подходит. Вы можете z1 подставить в текст программы awk

z1=$( awk 'program1' file )

awk "BEGIN { count=$z1 } /.../{ ... тут что-то с использованием $count... }" file2
либо сразу в тело
awk "/.../{ .... ${z1} ..... }" file2

Советую посмотреть какие-нибудь книжки про шелл скриптинг, sed и awk, чтобы увидеть примеры и понять, как с этим работают.
Уверен, что после пары часов чтения вы перепишете свои упражнения гораздо логичнее и короче.

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

6. "вернуть значение из awk"  +/
Сообщение от d2e8k7 (ok), 16-Окт-19, 17:42 
>[оверквотинг удален]
> awk
> z1=$( awk 'program1' file )
> awk "BEGIN { count=$z1 } /.../{ ... тут что-то с использованием $count...
> }" file2
> либо сразу в тело
> awk "/.../{ .... ${z1} ..... }" file2
> Советую посмотреть какие-нибудь книжки про шелл скриптинг, sed и awk, чтобы увидеть
> примеры и понять, как с этим работают.
> Уверен, что после пары часов чтения вы перепишете свои упражнения гораздо логичнее
> и короче.

Как-то не подошло такое решение для моего случая
z=$(awk '{print 1;  print 3; print 4 " " 5;print "End of out"} END{print 2 }' data.txt > out.txt)
echo $z
пустой вывод

вот так я сделал:
awk '{print 1;  print 3; print 4 " " 5;print "End of out"} END{print 2 > "cnt.txt"; print "from END"}' data.txt > out.txt

Спасибо, что уделили внимание
count=`cat cnt.txt`
awk -v myCnt=$count 'BEGIN{print "cnt is " myCnt}'

Т.е.
- в первом скрипте выводятся какие-то данные в файл out.txt.
- В блоке END выводим значение count в файл.
- Откуда его потом считываем и передаем в след. awk-скрипт


Спасибо, что уделили внимание

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

7. "вернуть значение из awk"  +/
Сообщение от Аноним (5), 16-Окт-19, 22:13 
>[оверквотинг удален]
> of out"} END{print 2 > "cnt.txt"; print "from END"}' data.txt >
> out.txt
> Спасибо, что уделили внимание
> count=`cat cnt.txt`
> awk -v myCnt=$count 'BEGIN{print "cnt is " myCnt}'
> Т.е.
> - в первом скрипте выводятся какие-то данные в файл out.txt.
> - В блоке END выводим значение count в файл.
> - Откуда его потом считываем и передаем в след. awk-скрипт
> Спасибо, что уделили внимание

Если оба вызова авк так тесно связаны, логично запустить второй авк из первого. В том же блоке END через system().
Но все равно должен быть какой-то менее замороченный путь.

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


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

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




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

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