首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在awk中将文件的列名作为变量传递

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

Stack Overflow用户
提问于 2019-08-12 03:26:38
回答 1查看 1.1K关注 0票数 0

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

我尝试过使用"-v"设置是可变的,但它考虑"$"作为字符串。我的分隔符是特殊字符^A (ctrl+v+a)。

代码语言:javascript
复制
vi test_file.dat
a^Ab^Ac^Ad^Ae^Af^Ag^Ah^Ai^Aj^Ak^Al^Am^An^Ao^Ap

工作代码

代码语言:javascript
复制
awk -F'^A' '{print $2,$5,$7}' test_file.dat

这是印刷

代码语言:javascript
复制
b e g

但如果我试着

代码语言:javascript
复制
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

这是印刷

代码语言:javascript
复制
$2 $5 $7

我期望输出

代码语言:javascript
复制
b e g

并且我希望将分隔符、列、文件名作为参数传递,如

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-08-12 04:43:15

在awk中,$符号实际上是一个以字段号为参数的运算符。字段名是表达式,这就是为什么$NF用于表示最后一个字段:NF是由$运算符计算的。所以正如你所看到的,我们不应该在字段名中包含美元符号。

如果您使用环境将材料传递给Awk,那么正确的做法是让Awk从环境中捡起它。

可以使用ENVIRON关联数组访问环境。如果一个名为delimiter的变量持有字段分隔符,我们可能会执行如下操作

代码语言:javascript
复制
BEGIN { FS = ENVIRON["delimiter"] }

在Awk密码里。然后,我们将不再处理新一轮的shell参数插值问题。

我们也可以得到类似的字段号。可以使用split函数将它们放入数组中。请参阅以下一行:

代码语言:javascript
复制
$ 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

表达式length(f)给出了字段的数目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57455321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档