对 awk 脚本感到困惑

对 awk 脚本感到困惑

说明表明您的脚本文件将使用以下命令在我们的系统上进行测试:

awk -f ./awk4.awk input.csv

编写一个 awk 脚本,该脚本将接受以下文件并输出姓名和成绩字段

任务1

显然,我创建了一个 bash 脚本,它需要是一个 awk 脚本,可以从命令行使用 awk -f 运行。下面是我的代码。有没有一种简单的方法可以将 bash 脚本转换为 awk 脚本而无需重做所有内容?对方向真的很困惑。

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' $1

答案1

在 awk 脚本中,内容是您将awk作为命令提供的内容。所以在这种情况下,那就是:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

然而,这会让使用-F ,so 而不是在块FS中设置变得很棘手BEGIN

所以你的脚本将是:

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

答案2

你已经写了一个awk脚本,但是把它放在了一个脚本中。这是你的awk脚本:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}

将其保存到文件中script.awk并运行

awk -F',' -f script.awk inputfile

现在对您的脚本有一些提示:

awk命令看起来像CONDITION {COMMAND(S)}.如果CONDITION满足一行(记录),{COMMAND(S)}则执行。如果不存在CONDITION{COMMAND(S)}则对所有记录执行,如果不存在则只要满足{COMMAND(S)}就打印该记录 。CONDITION

在你的情况下:

  1. /./是一个与任何字符匹配的正则表达式...所以除了空行之外的所有行 - 作为一个条件,它几乎是多余的

  2. 您用作" "变量之间的分隔符,用于,应用默认值

  3. 您需要,在脚本的初始块中提供 using 作为分隔符BEGIN


BEGIN {FS=","}
{print $1,$2}

如果您也想使用逗号作为输出分隔符,请使用:

BEGIN {FS=OFS=","}
{print $1,$2}

答案3

awk 脚本只是可由awk. awk 脚本有两种编写方法:

  1. 只需将 awk 命令写入文本文件并使用awk -f /path/to/file.awk.在你的情况下,那就是:

    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    你可以将其运行为:

    awk -F, -f /path/to/file.awk inputFile
    

    或者,如果您需要仅使用 运行它awk -f ./path/to/file.awk inputFile,而不使用-F,则在脚本本身中设置字段分隔符:

    BEGIN{ FS=","}
     /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    然后运行awk -f /path/to/file.awk inputFile

  2. 编写命令,但使用 shebang 指定哪个解释器应该读取脚本。在你的情况下,看起来像这样:

    #!/usr/bin/awk -f
    
    ## With this approach, you can't use -F so you need to set
    ## the field separator in a BEGIN{} block.
    BEGIN{ FS=","}
    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    然后你可以使脚本可执行(chmod a+x /path/to/file.awk)并像这样运行它:

    /path/to/file.awk inputFile
    
    

这些都是 awk 脚本。第三个选项是写一个脚本,并让 shell 脚本运行 awk。那看起来像这样:

#!/bin/sh

awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' "$1"

你所拥有的既不是一件事,也不是另一件事:你使用的是 awk shebang,但有一个 shell 脚本而不是 awk 脚本。

相关内容