脚本正在运行。我添加了一些评论并将其重命名然后提交。今天我的导师告诉我它不起作用并给我awk 1 unexpected character '.'
的错误
该脚本应该在命令行中读取名称并返回该名称的学生信息。
现在我检查了它,令人惊讶的是它给了我错误。
我应该通过这样的命令运行它:
scriptName -v name="aname" -f filename
这个问题是什么,我的代码的哪一部分成功了?
#!/usr/bin/awk
BEGIN{
tmp=name;
nameIsValid;
if (name && tolower(name) eq ~/^[a-z]+$/ )
{
inputName=tolower(name)
nameIsValid++;
}
else
{
print "you have not entered the student name"
printf "Enter the student's name: "
getline inputName < "-"
tmp=inputName;
if (tolower(inputName) eq ~/^[a-z]+$/)
{
tmpName=inputName
nameIsValid++
}
else
{
print "Enter a valid name!"
exit
}
}
inputName=tolower(inputName)
FS=":"
}
{
if($1=="Student Number")
{
split ($0,header,FS)
}
if ($1 ~/^[0-9]+$/ && length($1)==8)
{
split($2,names," ")
if (tolower(names[1]) == inputName || tolower(names[2])==inputName )
{
counter++
for (i=1;i<=NF;i++)
{
printf"%s:%s ",header[i], $i
}
printf "\n"
}
}
}
END{
if (counter == 0 && nameIsValid)
{
printf "There is no record for the %-10s\n" , tmp
}
}
答案 0 :(得分:3)
以下是修复脚本的步骤:
NULL
陈述(在行尾的尾随分号)。eq
(它不是一个相等运算符!)。nameIsValid;
声明。printf "\n"
更改为更简单的print ""
。,FS
arg到split()
。name && tolower(name) ~ /^[a-z]+$/
更改为该条件的第二部分,因为如果匹配则当然会填充名称。tolower()
并使用字符类而不是显式a-z
范围。tmp
变量。BEGIN
逻辑。nameIsValid
变量。这是结果(未经测试,因为没有发布样本输入/输出):
BEGIN {
if (name !~ /^[[:alpha:]]+$/ ) {
print "you have not entered the student name"
printf "Enter the student's name: "
getline name < "-"
}
if (name ~ /^[[:alpha:]]+$/) {
inputName=tolower(name)
FS=":"
}
else {
print "Enter a valid name!"
exit
}
}
$1=="Student Number" { split ($0,header) }
$1 ~ /^[[:digit:]]+$/ && length($1)==8 {
split(tolower($2),names," ")
if (names[1]==inputName || names[2]==inputName ) {
counter++
for (i=1;i<=NF;i++) {
printf "%s:%s ",header[i], $i
}
print ""
}
}
}
END {
if (counter == 0 && inputName) {
printf "There is no record for the %-10s\n" , name
}
}
答案 1 :(得分:2)
我将shebang线改为:
#!/usr/bin/awk -f
然后在命令行中没有使用-f。它现在正在运作
答案 2 :(得分:0)
按以下方式运行脚本:
awk -f script_name.awk input_file.txt
这似乎可以抑制警告和错误。
答案 3 :(得分:0)
在我的情况下,问题是按照this answer中的建议将IFS变量重置为IFS=","
,以将字符串拆分为数组。因此,我重置了IFS变量,并使我的代码正常工作。
IFS=', '
read -r -a array <<< "$string"
IFS=' ' # reset IFS