Awk交叉引用代码无法在不同平台上运行

时间:2018-03-18 10:59:18

标签: bash awk gawk

我有一个使用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

username.email输入:

example:email@email.com

email.phone.txt输入:

email@email.com:0123456789

username.phone输出:

example:0123456789

所以这里发生的事情是电子邮件是否在> email.phone.txt,输出>用户名和&用户名.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

1 个答案:

答案 0 :(得分:2)

为什么在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以将它们作为文字字符串传递给不要让shell在将其传递给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