首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk + set变量在awk中

awk + set变量在awk中
EN

Unix & Linux用户
提问于 2018-04-24 11:21:36
回答 2查看 40.8K关注 0票数 4

以下简单的bash脚本打印行号(来自list.txt文件):

代码语言:javascript
复制
function get_row

{ 
  
[[ $1 = 1 ]] &&  awk '{print $1}' list.txt
[[ $1 = 2 ]] &&  awk '{print $2}' list.txt
 
} 


get_row 1
get_row 2

但我想写得更文雅些。

是否可以将$1设置为awk '{print $val}'变量,以便如果我将函数调用为get_row 1,变量$val将获得值1

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-04-24 11:30:35

你想要这样的东西吗?

代码语言:javascript
复制
function get_column
{ 
    awk -v val=$1 '{print $val}' list.txt
}

上面是用传递给函数的$1返回列匹配。如果您确实需要在$1 from函数中打印与行号匹配的行,请使用下面的方法。

代码语言:javascript
复制
function get_row
{ 
    awk -v val=$1 'NR==val{print ; exit}' list.txt
}

或者让shell计算并设置val值,并在awk中打印它,如下所示:

代码语言:javascript
复制
function get_column
{ 
    awk '{print $val}' val=$1 list.txt
}
代码语言:javascript
复制
function get_row
{ 
    awk 'NR==val{print ; exit}' val=$1 list.txt
}

这里传递的是只有数字的val如果val原含backslash转义字符你会遇到问题awk对通过-v val=传递的值执行C转义序列处理,带有val="\\n"的shell变量将通过awk更改为\n值。

票数 8
EN

Unix & Linux用户

发布于 2018-04-24 11:40:05

您可以使用:

代码语言:javascript
复制
field=$1 awk '{print $ENVIRON["field"]}'

它适用于所有POSIX兼容的系统,并且在使用-v val=时不必担心代码注入

另外,函数应该命名为get_column,而不是get_row

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

https://unix.stackexchange.com/questions/439710

复制
相关文章

相似问题

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