awk + ​​在 awk 中设置变量

awk + ​​在 awk 中设置变量

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

function get_row

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


get_row 1
get_row 2

但我想写得更优雅一些。

是否可以将$1变量设置为 as awk '{print $val}',这样如果我调用函数 as get_row 1,变量$val就会获取值1

答案1

你想要这样的东西吗?

function get_column
{ 
    awk -v val=$1 '{print $val}' list.txt
}

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

function get_row
{ 
    awk -v val=$1 'NR==val{print ; exit}' list.txt
}

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

function get_column
{ 
    awk '{print $val}' val=$1 list.txt
}
function get_row
{ 
    awk 'NR==val{print ; exit}' val=$1 list.txt
}

在这里你val只通过数字和如果val包含反斜杠转义字符你会遇到一个问题它对awk通过传递的值进行 C 转义序列处理-v val=,并且 shell 变量 withval="\\n"将更改为\nby的值awk

答案2

您可以使用:

field=$1 awk '{print $ENVIRON["field"]}'

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

此外,该函数应该命名get_column而不是get_row.

相关内容