awk 语法错误
Posted
技术标签:
【中文标题】awk 语法错误【英文标题】:Awk syntax errors 【发布时间】:2021-09-07 04:36:11 【问题描述】:我是 Awk 的新手。 我有一个包含 awk 脚本的文件夹和一个名为 MODELE1 的文件。 我正在尝试运行我的脚本,更具体地说是以下行:
awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
awk "($1 == "GRID") print $0" MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
但我得到了错误 ^ 表达式中的无效字符 ''' 对于'...'
我尝试将其更改为 ...
和 " ..." 。在第一种情况下,我收到相同的错误消息,在第二种情况下,“排序”出现语法错误。
有人知道怎么解决吗?
提前致谢。
编辑:为清楚起见,这是整个脚本,称为 grid_sorting:
#!/bin/awk -f
# Model and GRID cards extraction
awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
# GRID sorting
awk '($1 == "GRID") print $0' MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
# Model and sorted GRID cards concatenation
cat MAIL_SANS_GRID GRID_REP_COQ > MODELE
然后我使用命令在终端中运行脚本
./grid_sorting
我得到错误:
awk: ./grid_sorting:4: awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
awk: ./grid_sorting:4: ^ invalid char ''' in expression
awk: ./grid_sorting:4: awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
awk: ./grid_sorting:4: ^ syntax error
如果我切换到双引号:
#!/bin/awk -f
# Model and GRID cards extraction
awk "($1 != "GRID") print $0" MODELE1 > MAIL_SANS_GRID
# GRID sorting
awk "($1 == "GRID") print $0" MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
# Model and sorted GRID cards concatenation
cat MAIL_SANS_GRID GRID_REP_COQ > MODELE
我得到错误:
awk: ./grid_sorting:6: awk "($1 == "GRID") print $0" MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
awk: ./grid_sorting:6: ^ syntax error
中间文件 MAIL_SANS_GRID 已创建但为空。
【问题讨论】:
But I get the error
请逐字发布整个错误。前面没有awk: something: something:
吗?错误正是^ invalid char ''' in the expression For the '...'
? awk
在错误前打印 awk:
。所以你注意到第一行是awk '
,第二行是awk "
?
关于 more specifically the line:
- 该语句后面是 2 行,而不是 1。这 2 行中的哪一行出现了语法错误?
嗨!谢谢大家的 cmets Ed Morton,这是我的拼写错误,我的意思是行 rowboat,我在终端 @KamilCuk 中运行命令 ./grid_sorting(脚本的名称)这里是完整的错误声明原始脚本(所以使用' ... '): molx1801: ./grid_sorting awk: ./grid_sorting:4: awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID awk: ./grid_sorting: 4: ^ invalid char ''' in expression awk: ./grid_sorting:4: awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID awk: ./grid_sorting:4: ^ 语法错误
这能回答你的问题吗? Difference between single and double quotes in Bash
@elle.delle 请不要在无法格式化且容易遗漏的 cmets 中添加信息。 edit您的问题包括所有相关信息。另外,对于我的具体问题,我并不是要您将文本中的“1 行”更改为“行”,而是要求您告诉我们哪一行产生了您的错误消息显示在 2 行下方。
【参考方案1】:
将第一行 #!/bin/awk -f
更改为 #!/bin/bash
或任何等效的 shell:
#!/bin/bash
# Model and GRID cards extraction
awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
# GRID sorting
awk '($1 == "GRID") print $0' MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
# Model and sorted GRID cards concatenation
cat MAIL_SANS_GRID GRID_REP_COQ > MODELE
第一行叫做Shebang。它指示哪个程序将解码您的脚本。请参阅:Shebang。
如果你把awk
的路径放在那里(一般不推荐),你的脚本必须包含纯awk
语句。但是如果你从命令行调用awk
,包括一些文件名和一些重定向到sort
,就像你的例子一样,你的脚本必须从shell命令解释器解释,比如bash
。
换句话说,从awk
内部调用awk
是没有意义的,就像您在脚本中使用错误的shebang 所做的那样。
【讨论】:
【参考方案2】:这不是与awk
直接相关的问题,而是与bash
或sh
相关的问题。您应该像在第一行中一样在第二行中使用单引号:
awk '($1 != "GRID") print $0' MODELE1 > MAIL_SANS_GRID
awk '($1 == "GRID") print $0' MODELE1 | sort -n -k 2,2 > GRID_REP_COQ
否则,您的 shell 会将 $0
和 $1
替换为一些值。
【讨论】:
“它不起作用”是最糟糕的问题陈述,因为它没有告诉我们可以用来尝试解决问题的问题。想象一下感觉不舒服,只是告诉你的医生“我不工作”,或者把你的车送到机械师那里解决问题,然后只是说“它不工作”而不是描述任何症状。以上是关于awk 语法错误的主要内容,如果未能解决你的问题,请参考以下文章