将变量传递给awk并在正则表达式中使用它

Nie*_*Bom 18 regex variables awk

我正在学习awk,我无法将变量传递给脚本并将其作为正则表达式搜索模式的一部分使用.

这个例子是设计的,但显示了我的探索.

我的数据如下:

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
Run Code Online (Sandbox Code Playgroud)

我想要一个awk脚本,我可以传递一个变量,然后让awk脚本为变量做一个正则表达式.我现在有一个名为"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";
}
Run Code Online (Sandbox Code Playgroud)

我这样调用脚本:

awk -f 003_search_persons.awk name=Smith 003_persons.txt
Run Code Online (Sandbox Code Playgroud)

它返回以下内容,这很好.

firstName lastName City
Eddy Smith Los Angeles
Frank Smith Chicago
Victoria McSmith Los Angeles
Barbara Smithy Boston
Jane McSmithy Chicago
Run Code Online (Sandbox Code Playgroud)

但现在我想寻找一个特定的前缀"Mc".我可以硬编码这个,但我想要一个灵活的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";
}
Run Code Online (Sandbox Code Playgroud)

我这样调用脚本:

awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt
Run Code Online (Sandbox Code Playgroud)

但现在它没有找到任何记录.

问题是搜索模式"/ ^ prefix /".我知道我可以用非正则表达式替换那个搜索模式,就像在第一个脚本中一样,但是假设我想用正则表达式来做,因为我需要前缀真正位于lastName字段的开头,因为它应该是,作为前缀和所有;-)

我该怎么做呢?

gho*_*g74 16

你可以试试这个

BEGIN{
 printf "firstName lastName City\n";
 split(ARGV[1], n,"=")
 prefix=n[2]
 pat="^"prefix
}
$0 ~ pat{
    print "found: "$0
}
Run Code Online (Sandbox Code Playgroud)

产量

$ awk -f  test.awk name=Jane file
firstName lastName City
found: Jane        McSmithy    0612345678  1947-01-15    Chicago
Run Code Online (Sandbox Code Playgroud)

查看awk文档了解更多信息.(并从头到尾阅读!)

  • 这些分裂的东西都不是必需的,因为在arg列表中使用name = Jane会创建一个名为"name"的变量,其值为"Jane",所以你可以在FNR == 1部分中说"pat ="^"name` .尽管如此,最好使用"-v"设置变量,因此您不必解决未在BEGIN部分填充的变量. (4认同)

Ed *_*ton 5

将您的脚本更改为:

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

$0 ~ "^" prefix {
    print $1, $2, $5, $6
}
Run Code Online (Sandbox Code Playgroud)

并称之为

awk -v prefix="Mc" -f 003_search_persons.awk 003_persons.txt
Run Code Online (Sandbox Code Playgroud)