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