Я изучаю awk, и я испытываю затруднения при передаче переменной сценарию И использовании его в качестве части regex шаблона поиска.
Пример изобретен, но показывает мой probem.
Мои данные следующие:
Eddy Smith 0600000000 1981-07-16 Los Angeles
Frank Smith 0611111111 1947-04-29 Chicago
Victoria McSmith 0687654321 1982-12-16 Los Angeles
Barbara Smithy 0633244321 1984-06-24 Boston
Jane McSmithy 0612345678 1947-01-15 Chicago
Grace Jones 0622222222 1985-10-07 Los Angeles
Bernard Jones 0647658763 1988-01-01 New York
George Jonesy 0623428948 1983-01-01 New York
Indiana McJones 0698732298 1952-01-01 Miami
Philip McJonesy 0644238523 1954-01-01 Miami
Я хочу awk сценарий, что я могу передать переменную и затем иметь awk сценарий, делают regex для переменной. У меня есть этот сценарий, теперь названный "003_search_persons.awk".
#this awk script looks for a certain name, returns firstName, lastName and City
#print column headers
BEGIN {
printf "firstName lastName City\n";
}
#look for the name, print firstName, lastName and City
$2 ~ name {
printf $1 " " $2 " " $5 " " $6;
printf "\n";
}
Я называю сценарий как это:
awk -f 003_search_persons.awk name=Smith 003_persons.txt
Это возвращает следующее, которое хорошо.
firstName lastName City
Eddy Smith Los Angeles
Frank Smith Chicago
Victoria McSmith Los Angeles
Barbara Smithy Boston
Jane McSmithy Chicago
Но теперь я хочу искать определенный префикс "МГц". Я мог, конечно, hardcode это, но я хочу awk сценарий, который гибок. Я записал следующее в 003_search_persons_prefix.awk.
#this awk script looks for a certain prefix to a name, returns firstName, lastName and City
#print column headers
BEGIN {
printf "firstName lastName City\n";
}
#look for the prefix, print firstName, lastName and City
/^prefix/{
printf $1 " " $2 " " $5 " " $6;
printf "\n";
}
Я называю сценарий как это:
awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt
Но теперь это не находит записей.
Проблемой является шаблон поиска "/^prefix /". Я знаю, что могу заменить тот шаблон поиска non-regex один, как в первом сценарии, но предположить, что я хочу сделать это с regex, потому что мне нужен префикс, чтобы действительно быть в начале lastName поля, как это должно быть, будучи префиксом и всеми;-)
Как я делаю это?
вы можете попробовать этот
BEGIN{
printf "firstName lastName City\n";
split(ARGV[1], n,"=")
prefix=n[2]
pat="^"prefix
}
$0 ~ pat{
print "found: "$0
}
вывод
$ awk -f test.awk name=Jane file
firstName lastName City
found: Jane McSmithy 0612345678 1947-01-15 Chicago
Дополнительные сведения см. В документации по awk . (и прочтите его от начала до конца!)
требуется ли awk специально? Я уверен, что это вполне возможно в awk, но я этого не знаю, если вам просто нужно выполнить работу, вы можете попробовать. не совсем уверен, что это за разделитель.
cut -d " " -f1-2,5 file | egrep '^regex'
Вы сможете использовать исходный скрипт без изменений - $ 2 ~ name
уже выполняет поиск по регулярному выражению, поэтому, если вы вызовете свой скрипт с помощью name = ^ Mc
, он вернется. имена, начинающиеся с «Mc». На самом деле это не очень хороший пример, поскольку Mc появляется только в начале имени - если вы используете name = ^ Smith
, тогда он найдет Смитов, но не МакСмитов.