我有一个带有
|
分隔符的 .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}
?
$
的变量会将其转换为对列的引用。所以 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
您可以直接通过名称引用 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'
您不仅可以通过在变量前面放置
$
来在变量中使用数字,还可以在表达式前面放置 $
!
$ date | tee /dev/stderr | awk '{print $(2+2)}'
Mon Aug 3 12:47:39 CDT 2020
12:47:39