如何将存储值作为列号参数传递给 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'
其他答案大部分是正确的,但只是想添加一些注释,以防不完全清楚。
- 引用前面带有
$
的变量会将其转换为对该列的引用。所以 i=3; print $i; print i
将打印第三列,然后是数字 3。
- 将所有变量放在命令行中将避免尝试在单引号
awk
代码中包含 bash
变量时出现任何问题,这将不起作用。
- 您可以让
awk
输出到特定文件,而不是依赖 bash 重定向输出和移动文件。
- 命令行上的
-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
我有一个带有 |
分隔符的 .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'
其他答案大部分是正确的,但只是想添加一些注释,以防不完全清楚。
- 引用前面带有
$
的变量会将其转换为对该列的引用。所以i=3; print $i; print i
将打印第三列,然后是数字 3。 - 将所有变量放在命令行中将避免尝试在单引号
awk
代码中包含bash
变量时出现任何问题,这将不起作用。 - 您可以让
awk
输出到特定文件,而不是依赖 bash 重定向输出和移动文件。 - 命令行上的
-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