使用 Variable Int 作为位置参数

使用 Variable Int 作为位置参数

我正在开发一个 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 $vareval 似乎都不起作用

所需代码:

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 提到的,他们甚至可以有相同的名字

相关内容