awk 语法错误

时间:2021-06-23 15:34:00

标签: sorting awk

我对 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 已创建但为空。

2 个答案:

答案 0 :(得分:3)

将第一行 #!/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 那样。

答案 1 :(得分:0)

这不是直接与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

相关问题