awk 1意外字符'。'突然出现了

时间:2012-10-24 08:05:14

标签: awk

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

答案 0 :(得分:3)

以下是修复脚本的步骤:

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

    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