Передающая переменная к awk и использованию это в регулярном выражении

Я изучаю 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 поля, как это должно быть, будучи префиксом и всеми;-)

Как я делаю это?

18
задан Niels Bom 9 February 2010 в 08:02
поделиться

3 ответа

вы можете попробовать этот

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 . (и прочтите его от начала до конца!)

16
ответ дан 30 November 2019 в 08:48
поделиться

требуется ли awk специально? Я уверен, что это вполне возможно в awk, но я этого не знаю, если вам просто нужно выполнить работу, вы можете попробовать. не совсем уверен, что это за разделитель.

cut -d " " -f1-2,5 file | egrep '^regex'
0
ответ дан 30 November 2019 в 08:48
поделиться

Вы сможете использовать исходный скрипт без изменений - $ 2 ~ name уже выполняет поиск по регулярному выражению, поэтому, если вы вызовете свой скрипт с помощью name = ^ Mc , он вернется. имена, начинающиеся с «Mc». На самом деле это не очень хороший пример, поскольку Mc появляется только в начале имени - если вы используете name = ^ Smith , тогда он найдет Смитов, но не МакСмитов.

1
ответ дан 30 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: