gpt4 book ai didi

linux - 如何在awk中将文件的列名作为变量传递

转载 作者:太空宇宙 更新时间:2023-11-04 11:46:33 24 4
gpt4 key购买 nike

我试图通过传递 int awk 命令来打印特定列中的数据

我曾尝试使用 "-v" 将 is 设置为变量,但将 "$" 视为字符串。我的分隔符是特殊字符 ^A (ctrl+v+a).

vi test_file.dat
a^Ab^Ac^Ad^Ae^Af^Ag^Ah^Ai^Aj^Ak^Al^Am^An^Ao^Ap

工作代码

awk -F'^A' '{print $2,$5,$7}' test_file.dat

正在打印

b e g

但如果我尝试

export fields='$2,$5,$7'
export file='test_file.dat'
awk -v sample_file="$test_file.dat" -v columns="$fileds" -F'^A' '{print columns}' sample_file

正在打印

$2 $5 $7

我希望输出为

b e g

我想将分隔符、列、文件名作为参数传递给

export fields='$2,$5,$7'
export file='test_file.dat'
export delimiter='^A'
awk -v sample_file="$test_file.dat" -v columns="$fields" -v file_delimiter="$delimiter" -F'file_delimiter' '{print columns}' sample_file

最佳答案

在 awk 中,$ symbol 实际上是一个将字段编号作为参数的运算符。字段名称是表达式,这就是为什么 $NF用于表示最后一个字段:NF$评估运算符(operator)。因此,如您所见,我们不应在字段名称中包含美元符号。

如果您使用环境将 Material 传递给 Awk,正确的做法是让 Awk 从环境中获取它。

可以使用 ENVIRON 访问环境关联数组。如果一个名为 delimiter 的变量持有字段分隔符,我们可能会做类似的事情

BEGIN { FS = ENVIRON["delimiter"] }

在 Awk 代码中。那么我们就不会再处理另一轮 shell 参数插值问题了。

我们可以类似地获取字段编号。 split函数可用于将它们放入数组中。引用这个单行:

$ fields=1,3,9 awk 'BEGIN { split(ENVIRON["fields"], f, ",") ;
for (i in f)
printf("f[%d] = %d\n", i, f[i]) ; }'
f[1] = 1
f[2] = 3
f[3] = 9

GNU Awk,表达式 length(f)给出字段数。

关于linux - 如何在awk中将文件的列名作为变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57455321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com