说明表明您的脚本文件将使用以下命令在我们的系统上进行测试:
awk -f ./awk4.awk input.csv
编写一个 awk 脚本,该脚本将接受以下文件并输出姓名和成绩字段
显然,我创建了一个 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
在你的情况下:
/./
是一个与任何字符匹配的正则表达式...所以除了空行之外的所有行 - 作为一个条件,它几乎是多余的您用作
" "
变量之间的分隔符,用于,
应用默认值您需要
,
在脚本的初始块中提供 using 作为分隔符BEGIN
。
BEGIN {FS=","}
{print $1,$2}
如果您也想使用逗号作为输出分隔符,请使用:
BEGIN {FS=OFS=","}
{print $1,$2}
答案3
awk 脚本只是可由awk
. awk 脚本有两种编写方法:
只需将 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
。编写命令,但使用 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 脚本。