Вы можете использовать
for i in $(seq $END); do echo $i; done
Ваш хэш-удар определяет, что скрипт не является скриптом оболочки, это скрипт awk. вы не можете сделать это в bash способом в вашем скрипте.
также то, что вы сделали: echo blah|awk ...
не не передает параметр, он передает вывод команды echo другой команде.
вы можете попробовать это следующим образом:
echo "hello"|./foo.awk file -
или
var="hello"
awk -v a="$var" -f foo.awk file
с этим, у вас есть var a
в вашем foo.awk, вы можете использовать это.
Если вы хотите сделать что-то вроде сценария оболочки, принимающего переменные $ 1 $, вы можете написать небольшой скрипт-оболочку, чтобы обернуть ваши awk-вещи.
РЕДАКТИРОВАТЬ
Нет, я не понял вас неправильно.
давайте рассмотрим пример:
скажем, у вашего x.awk
есть:
{print $1}
, если вы сделаете:
echo "foo" | x.awk file
, то же самое:
echo "foo"| awk '{print $1}' file
здесь ввод для awk только file
, ваш echo foo не имеет смысла. если вы сделаете:
echo "foo"|awk '{print $1}' file -
or
echo "foo"|awk '{print $1}' - file
awk принимает два ввода (аргументы для awk), один - это stdin, один - файл, в вашем скрипте awk вы можете:
echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file
это напечатает первым foo
из вашего эха, затем column1 из file
, конечно, этот пример ничего не делает, просто напечатайте их все.
Вы, конечно, можете иметь более двух входов, и не проверять NR и FNR, вы можете использовать
ARGC The number of elements in the ARGV array.
ARGV An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1
, например:
echo "foo"|./x.awk file1 - file2
, затем ваш "foo" - это второй аргумент, вы можете получить его в своем x.awk по ARGV[2]
echo "foo" |x.awk file1 file2 file2 -
, теперь это ARGV [4].
Я имею в виду, ваш echo "foo"|..
был бы stdin для awk, он мог бы с помощью 1-го или n-го «аргумента» / ввода для awk. зависит от того, куда вы положили -
(стандартный). Вы должны справиться с этим в своем скрипте на awk.
В awk
$1
упоминается первое поле в записи, а не первый аргумент, как в bash
. Вам нужно использовать ARGV
для этого, посмотрите здесь для официального слова.
Сценарий:
#!/bin/awk -f
BEGIN{
print "AWK Script"
print ARGV[1]
}
Демонстрация:
$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
Вы можете использовать -v
в качестве опции командной строки для предоставления переменной скрипту:
Скажем, у нас есть файл script.awk как это:
BEGIN {print "I got the var:", my_var}
Затем мы запустим это так:
$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me