Подтвердить что ты не робот

Передача переменной awk и использование ее в регулярном выражении

Я изучаю awk, и мне трудно передать переменную в script И использовать ее как часть шаблона поиска регулярных выражений.

Пример надуман, но показывает мой пример.

Мои данные следующие:

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 script, чтобы передать переменную, а затем awk script сделать регулярное выражение для переменной. У меня этот script теперь называется "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";
}

Я вызываю script следующим образом:

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

Но теперь я хочу найти определенный префикс "Mc". Я мог бы, конечно, жестко записать это, но я хочу, чтобы awk script был гибким. Я написал следующее в 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";
}

Я вызываю script следующим образом:

awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt

Но теперь он не находит записей.

Проблема заключается в шаблоне поиска "/^ префикс /". Я знаю, что я могу заменить этот шаблон поиска не-регулярным, как в первом script, но предположим, что хочу сделать это с помощью регулярного выражения, потому что мне нужно, чтобы префикс действительно находился в начале поля lastName, как и должно быть, это префикс и все; -)

Как это сделать?

4b9b3361

Ответ 1

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

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 documentation для получения дополнительной информации. (и прочитайте его от начала до конца!)

Ответ 2

Измените script на:

BEGIN {
    print "firstName", "lastName", "City"
    ORS = "\n\n"
}

$0 ~ "^" prefix {
    print $1, $2, $5, $6
}

и назовите его

awk -v prefix="Mc" -f 003_search_persons.awk 003_persons.txt

Ответ 3

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

Ответ 4

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

cut -d " " -f1-2,5 file | egrep '^regex'