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