Добрый день!
можно ли вернуть значение из awk в запускающий его shell-скрипт ?z1=$(awk '{print $5}' file) не подходит, потому что
awk-скрипт парсит файл, выводит строки по некоторым условиям и считает количество выведенных строк.
Значение количества строк хотелось бы вернуть в sh, чтобы использовать в другом awk.Благодарю откликнувшихся.
> z1=$(awk '{print $5}' file) не подходит, потому что
> Значение количества строк хотелось бы вернуть в sh, чтобыz1=$(awk 'END{print NR}' file)
Скрипт он на самом деле несколько сложнее. Примерно такой:
#/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
>[оверквотинг удален]
> count++;
> }
> }
> END{
> print count;
> print arr;
> }' file > output.txt
> ..
> awk '{}' <-- След. awk парсит другой файл. Сюда бы я
> хотел передать countawk 'ARGIND==1{count=$0;nextfile} {....}' output.txt ...
>[оверквотинг удален]
>> }
>> }
>> END{
>> print count;
>> print arr;
>> }' file > output.txt
>> ..
>> awk '{}' <-- След. awk парсит другой файл. Сюда бы я
>> хотел передать count
> awk 'ARGIND==1{count=$0;nextfile} {....}' output.txt ...Если я правильно понял, Вы советуете обрабатывать файлы одним и тем же awk-скриптом
Но у меня входные файлы имеют разную структуру, поэтому и awk-скрипты для них разные.
Есть ли у awk возможность возвращать значение? ENVIRON, как я понял, не может изменить
значение переменной окружения, упомянутый в первом сообщении способ не подходит... Получается никак не вернуть? :(
> 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, чтобы увидеть примеры и понять, как с этим работают.
Уверен, что после пары часов чтения вы перепишете свои упражнения гораздо логичнее и короче.
>[оверквотинг удален]
> 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-скрипт
Спасибо, что уделили внимание
>[оверквотинг удален]
> 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().
Но все равно должен быть какой-то менее замороченный путь.