awk 1意外字符'';突然出现

awk 1意外字符'';突然出现,awk,Awk,脚本正在运行。我添加了一些评论并重命名了它,然后提交了它。今天我的指导老师告诉我它不起作用,并告诉我awk 1意外字符的错误。 脚本应该在命令行中读取一个名称,并返回该名称的学生信息。 现在我检查了它,令人惊讶的是它给了我错误。 我应该通过如下命令运行它: scriptName -v name="aname" -f filename 这个问题是什么?我的代码的哪一部分造成了这个问题 #!/usr/bin/awk BEGIN{ tmp=name; nameIsValid; if (name &a

脚本正在运行。我添加了一些评论并重命名了它,然后提交了它。今天我的指导老师告诉我它不起作用,并告诉我
awk 1意外字符的错误。
脚本应该在命令行中读取一个名称,并返回该名称的学生信息。 现在我检查了它,令人惊讶的是它给了我错误。 我应该通过如下命令运行它:

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 
   }
   }
#/usr/bin/awk
开始{
tmp=名称;
名称有效;
如果(名称和托洛尔(名称)eq~/^[a-z]+$/)
{
inputName=tolower(名称)
nameIsValid++;
}
其他的
{
打印“您尚未输入学生姓名”
printf“输入学生姓名:”
getline inputName<“-”
tmp=输入名称;
if(tolower(inputName)eq~/^[a-z]+$/)
{
tmpName=inputName
名字是有效的++
}
其他的
{
打印“输入有效名称!”
出口
}
}
inputName=tolower(inputName)
FS=“:”
}
{
如果($1==“学生编号”)
{
拆分($0,页眉,FS)
}
如果($1~/^[0-9]+$/&&length($1)==8)
{
拆分($2,名称“”)
如果(tolower(名称[1])==inputName | | tolower(名称[2])==inputName)
{
柜台++

对于(i=1;i我将shebang线更改为:

#!/usr/bin/awk -f

然后在命令行中没有使用-f。它现在正在工作

以下是修复脚本的步骤:

  • 去掉所有那些虚假的
    NULL
    语句(在行尾的分号)
  • 从所有比较中去掉未设置的变量
    eq
    (它不是相等运算符!)
  • 清理缩进
  • 去掉第一个非功能性的
    nameIsValid;
    语句
  • printf“\n”
    更改为更简单的
    print”“
  • 去掉无用的
    ,FS
    arg到
    split()
  • name&&tolower(name)~/^[a-z]+$/
    更改为该条件的第二部分,因为如果该条件匹配,那么当然会填充名称
  • 摆脱所有这些
    tolower()
    s,使用字符类而不是显式
    a-z
    范围
  • 去掉
    tmp
    变量
  • 简化
    开始
    逻辑
  • 完全去除不必要的
    名称有效
    变量
  • 使awk主体更像awk
  • 以下是结果(未测试,因为没有发布样本输入/输出):

    开始{
    如果(名称!~/^[:alpha:]+$/){
    打印“您尚未输入学生姓名”
    printf“输入学生姓名:”
    getline名称<“-”
    }
    如果(名称~/^[:alpha:]+$/){
    inputName=tolower(名称)
    FS=“:”
    }
    否则{
    打印“输入有效名称!”
    出口
    }
    }
    $1==“学生编号”{split($0,页眉)}
    $1~/^[[:数字:]+$/&&length($1)=8{
    拆分(tolower($2),名称“”)
    如果(名称[1]==inputName | |名称[2]==inputName){
    柜台++
    
    对于(i=1;i,按以下方式运行脚本:

    awk -f script_name.awk input_file.txt
    

    这似乎抑制了警告和错误。

    在我的例子中,问题是将IFS变量重置为
    IFS=“,”
    ,如中为将字符串拆分为数组所建议的那样。因此,我重置了IFS变量并使代码正常工作

    IFS=', '
    read -r -a array <<< "$string"
    IFS=' ' # reset IFS
    
    IFS=','
    
    read-r-a array请确保您永远不要在/usr/bin/awk是旧的、已损坏的awk的Solaris上运行此脚本,否则您将得到神秘的语法错误和/或意外的输出。
    IFS=', '
    read -r -a array <<< "$string"
    IFS=' ' # reset IFS