我对 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 已创建但为空。
答案 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
相关的问题,而是与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
。