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