4

脚本正在运行。我添加了一些评论并将其重命名然后提交。今天我的导师告诉我它不起作用,并告诉我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 
   }
   }
4

4 回答 4

3

以下是修复脚本的步骤:

  1. 摆脱所有那些虚假的NULL陈述(行尾的分号)。
  2. 从所有比较中删除未设置的变量eq(它不是等式运算符!)。
  3. 清理缩进。
  4. 摆脱第一个非功能性nameIsValid;声明。
  5. 换成printf "\n"更简单的print ""
  6. 摆脱无用的,FSarg 到split().
  7. 仅更改name && tolower(name) ~ /^[a-z]+$/该条件的第二部分,因为如果匹配,那么当然会填充名称。
  8. 摆脱所有这些tolower()s 并使用字符类而不是显式a-z范围。
  9. 摆脱tmp变量。
  10. 简化你的BEGIN逻辑。
  11. 完全摆脱不必要的nameIsValid变量。
  12. 让 awk 主体更像 awk

这是结果(未经测试,因为没有发布示例输入/输出):

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
    }
}
于 2012-10-24T20:45:33.363 回答
2

我将shebang线更改为:

#!/usr/bin/awk -f

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

于 2012-10-24T08:18:40.233 回答
0

在我的情况下,问题是将 IFS 变量重置为IFS=","按照此答案中的建议将字符串拆分为数组。所以我重置了 IFS 变量并让我的代码工作。

IFS=', '
read -r -a array <<< "$string"
IFS=' ' # reset IFS
于 2019-01-17T11:05:07.520 回答
0

按以下方式运行脚本:

awk -f script_name.awk input_file.txt

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

于 2016-09-26T12:20:51.717 回答