我正在开发一个 awk 函数来处理文件翻译,我没想到会遇到替换问题。
当前代码:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
所以 File1 是我生成的,并且始终只有 3 个字段。但 File2 可以是多个文件之一,每个文件都将使用不同的参数号来访问其数据。
File2.a 可能有 20 个参数,其中参数 8 和 9 是目标值
File2.b 可能有 200 个参数,其中 4 和 159 是目标值
我该如何处理这种变化?我已经尝试过 ${$var}、${!var}、echo $var
eval 似乎都不起作用
所需代码:
NR == FNR {a[$1 FS $2] = $3; next}
${$var1} FS ${$var2} in a {${$var1} = a[${$var1} FS ${$var2}]}
[Where var1 and var2 acts as parameter args for File2]
[var1 = ${16} and var2 = ${25}]
另外:可以识别的参数数量是否有限制?我的反应是相互矛盾的。就像 $9 是最大值,${19} 是最大值,255,根据系统规格没有限制...等
编辑:我将尽力按照评论中的要求澄清我的问题,我正在使用 awk 来比较和替换文件中的参数。 File1 将始终有 3 个参数,前 2 个将与 File2 中的参数相关联。 File2 将具有不确定数量的参数。 file1 和 file2 之间的参数映射将由变量处理。因此,我尝试在 awk 中使用变量 ($var1) 作为位置参数。
如果我使用:
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $9 in a {$8 = a[$8 FS $9]}
1' File1 File2
我的代码有效。
如果我使用:
var1=9
$ awk -F'|' '
BEGIN{OFS = FS}
NR == FNR {a[$1 FS $2] = $3; next}
$8 FS $var1 in a {$8 = a[$8 FS $var1]}
1' File1 File2
它不再起作用了
我尝试用 ${$var1} / $(!var1) / $$var1 替换 $9 (在 awk 中)
这些都没有按预期工作 对于文件架构师,请参阅我的上一个问题
答案1
请理解该符号$
对于 shell(例如 bash)和awk
.
在shell中,${name}
引入变量扩展,当该变量为整数时,访问的变量是shell的列表论点。在 shell (bash) 中,最大的参数(不带{…}
)是$9
,但{…}
只要授予新的内存请求,就没有(设置)限制。
是一个操作awk
符$
来访问字段输入线的。 mawk 中存在 32767 个可能字段的硬限制:
$ echo $(seq 80000) | mawk '{print $(32767+2)}'
mawk: program limit exceeded: maximum number of fields size=32767
但在 GNU awk 中则不然:
$ echo $(seq 80000) | awk '{print $(32767+2)}'
32769
在awk
里面$
操作员可以重复(如!
(和其他一些)可以重复):
$ awk 'BEGIN{var=111;print( !!!!!!var )}'
1
$ echo 23 {a..z} | awk '{field=1;print( $$field )}'
v
这更接近您的需要吗?
awk 'NR == FNR {a[$1 FS $2] = $3; next}
$$indexa FS $$indexb in a {$$indexa = a[$$indexa FS $$indexb]}
' filea indexa=16 indexb=25 fileb
答案2
为未来的搜索者留下答案。由 pLumo 和其他评论者提供。
awk 和 bash 对待 '$' 的方式不同。您可以使用awk -v $var1=$input
-v 用于创建变量。 $var1 是 awk 变量名。 $input 是 bash 变量名。正如 Issac 提到的,他们甚至可以有相同的名字