如何将存储的值作为列号参数传递以在 awk 中进行编辑?

问题描述 投票:0回答:3

我有一个带有

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

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

这将整行更改为8,显然不起作用。我想知道写这部分的正确方法是什么

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

例如,如果我想将第四列更改为 8 并且我有

value=4
,那么如何获得
{$4=8}

bash awk parameter-passing sh
3个回答
6
投票
  • 引用前面带有
    $
    的变量会将其转换为对列的引用。所以
    i=3; print $i; print i
    将打印第三列,然后打印数字 3。
  • 将所有变量作为选项传递将避免尝试在
    bash
    代码中插入
    awk
    变量时出现任何问题,这要么不起作用(使用单引号代码),要么非常混乱。
  • -F
    选项为您指定
    FS
    ,因此使用它并在代码中设置它是多余的。

我会这样做:

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

鉴于此输入:

1|34|test|should be 8|8583|foo
2|68|test|should be left alone|5828|bar
3|61|test|should be left alone|6682|baz

这是输出:

1|34|test|8|8583|foo
2|68|test|should be left alone|5828|bar
3|61|test|should be left alone|6682|baz

2
投票

您可以直接通过名称引用 awk 变量,稍微重写您的脚本并正确引用列号 var...

awk -F'|' -v var="$value" 'BEGIN{OFS=FS} $1=="$id"{$var=8}1'
只要 $value 是数字,

就应该可以工作。 如果

id
是另一个 bash 变量,则以与 awk 变量相同的方式传递它

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

2
投票

您不仅可以通过在变量前面放置

$
来在变量中使用数字,还可以在表达式前面放置
$

$ date | tee /dev/stderr | awk '{print $(2+2)}'
Mon Aug  3 12:47:39 CDT 2020
12:47:39
© www.soinside.com 2019 - 2024. All rights reserved.