如何将存储值作为列号参数传递给 awk 编辑?

How do I pass a stored value as the column number parameter to edit in awk?

我有一个带有 | 分隔符的 .dat 文件,我想更改由作为参数传递并存储在 var 中的数字定义的列的值。我的代码是

awk -v var="$value" -F'|' '{ FS = OFS = "|" } =="$id" {$"\{$var}"=8}1'   
myfile.dat > tmp && mv tmp myfiletemp.dat

这样把整行改成8,显然不行。我想知道写这部分的正确方法是什么

{$"\{$var}"=8}1

比如我想把第四列改成8,我有value=4,我怎么得到{=8}

您可以直接通过名称引用 awk 变量,通过正确引用列号变量对脚本进行轻微重写...

awk -F'|' -v var="$value" 'BEGIN{OFS=FS} =="$id"{$var=8}1'

只要 $value 是一个数字就应该可以工作。如果 id 是另一个 bash 变量,以与 awk 变量相同的方式传递它

awk -F'|' -v var="$value" -v id="$id" 'BEGIN{OFS=FS} ==id{$var=8}1'

其他答案大部分是正确的,但只是想添加一些注释,以防不完全清楚。

  1. 引用前面带有 $ 的变量会将其转换为对该列的引用。所以 i=3; print $i; print i 将打印第三列,然后是数字 3。
  2. 将所有变量放在命令行中将避免尝试在单引号 awk 代码中包含 bash 变量时出现任何问题,这将不起作用。
  3. 您可以让 awk 输出到特定文件,而不是依赖 bash 重定向输出和移动文件。
  4. 命令行上的 -F 选项为您指定了 FS,因此无需在您的代码中重新声明它。

我会这样做:

#!/bin/bash
column=4
value=8
id=1
awk -v col="$column" -v val="$value" -v id="$id" -F"|" '
    BEGIN {OFS="|"}
    {==id && $col=val; print > "myfiletemp.dat"}
' myfile.dat

您不仅可以通过在变量前面加上 $ 来在变量中使用数字,还可以在表达式前面加上 $

$ date | tee /dev/stderr | awk '{print $(2+2)}'
Mon Aug  3 12:47:39 CDT 2020
12:47:39