awk 交叉引用代码不适用于不同的平台

Awk cross reference code not working on different platform

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

脚本示例是:

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

username.email 输入:

example:email@email.com

email.phone.txt 输入:

email@email.com:0123456789

username.phone 输出:

example:0123456789

所以如果电子邮件在 > email.phone.txt 中,输出 > 用户名和 phone 在 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

为什么在 awk 命令的正文中使用 double-quotes? </code> 在 double-quoted 时具有特殊含义,<code> 的值被评估为位置参数并传递给 awk,因为它们没有值,这就是为什么它们是空的。由于 awk 看到一个空的下标数组,它抱怨它不是一个有效的数组。

干脆single-quote解决问题

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

一般来说,我们 single-quote 将动作部分作为 awk 将它们作为文字字符串传递,而不是让 shell 在将其传递给 [=12 之前进行解析=].如前所述,single-quotes 传递字符串 as-is 而不进行任何扩展。

如果您仍然想经历使用 double-quotes 的痛苦,请转义美元符号以剥夺其特殊含义,即使用转义字符,美元变量不会进行扩展(不推荐在任何方式)

"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