【问题标题】:Awk cross reference code not working on different platformawk 交叉参考代码在不同的平台上不起作用
【发布时间】:2018-08-27 01:48:36
【问题描述】:

我有一个使用 awk 的交叉引用 bash 脚本,但它可以在我的笔记本电脑上运行,但不能在我的其他计算机上运行:s..

脚本示例是:

"C:\cygwin\bin\gawk.exe" -F: "FNR==NR{a[$2]=$1;next} $1 in a{print a[$1] FS $2}" username.email.txt email.phone.txt > username.phone.txt

用户名.email 输入:

example:email@email.com

email.phone.txt 输入:

email@email.com:0123456789

username.phone 输出:

example:0123456789

所以这里发生的情况是如果电子邮件在 > email.phone.txt 中,输出 > username.phone.txt 中的用户名和电话在 3 个文件之间交叉引用。

这在另一台笔记本电脑上运行良好,但在另一台计算机上却无法运行。我收到语法错误和无效的下标表达式。

错误示例:

gawk: cmd. line:1: FNR==NR{a[]=;next}  in a{print a[] FS }
gawk: cmd. line:1:           ^ syntax error
gawk: cmd. line:1: error: invalid subscript expression
gawk: cmd. line:1: FNR==NR{a[]=;next}  in a{print a[] FS }
gawk: cmd. line:1:             ^ syntax error
gawk: cmd. line:1: FNR==NR{a[]=;next}  in a{print a[] FS }
gawk: cmd. line:1:                     ^ syntax error
gawk: cmd. line:1: FNR==NR{a[]=;next}  in a{print a[] FS }
gawk: cmd. line:1:                                  ^ syntax error
gawk: cmd. line:1: error: invalid subscript expression

【问题讨论】:

  • 您是否在计算机上使用不同的 shell?您的脚本示例对于 cmd.exe(标准 Windows 命令行)看起来是正确的,但对于 bash 是错误的。

标签: bash awk gawk


【解决方案1】:

为什么在awk 命令的正文中使用双引号? $1 在双引号中具有特殊含义,$1 的值被评估为位置参数并传递给awk,因为它们没有值,这就是它们为空的原因。由于awk 看到一个空的下标数组,它抱怨它不是一个有效的数组。

只需单引号即可解决问题。

"C:\cygwin\bin\gawk.exe" -F: 'FNR==NR{a[$2]=$1;next} $1 in a{print a[$1] FS $2}' username.email.txt email.phone.txt > username.phone.txt

一般来说,我们将操作部分单引号引用到awk 以将它们作为文字字符串传递,以在将其传递给awk 之前不让shell 进行解析。如前所述,单引号按原样传递字符串,而不经过任何扩展。

如果您仍然想经历使用双引号的痛苦,请转义美元符号以剥夺其特殊含义,即使用转义字符,美元变量不会经历扩展(无论如何都不推荐)

"C:\cygwin\bin\gawk.exe" -F: "FNR==NR{a[\$2]=\$1;next} \$1 in a{print a[\$1] FS \$2}" username.email.txt email.phone.txt > username.phone.txt

【讨论】:

  • 通过命令路径,我猜 OP 正试图在 Windows 上运行脚本,所以他不能使用单引号。通常的建议是将脚本放在一个文件中并作为 awk -f 脚本运行,以避免 WIndows 噩梦般的引用规则,而不是尝试使用双引号。或者甚至更好地安装 cygwin 并从中运行 awk。
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多