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直接相关的问题,而是与bashsh相关的问题。您应该像在第一行中一样在第二行中使用单引号:

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 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

精通awk系列:awk命令结构和awk语法结构

awk 语法

检查tcl脚本语法错误

awk基础语法与简单示例

Linux记录-AWK语法

请大家帮忙一下 mysql 语法错误