awk + ​​在 awk 中设置变量

yae*_*ael 3 bash 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
Run Code Online (Sandbox Code Playgroud)

但我想写得更优雅...

是否可以将“$1”设置为变量 awk '{print $val}'

所以如果我将函数调用为 get_row 1 那么 $val 将获得值 1

αғs*_*нιη 6

你想要这样的东西吗?

function get_column
{ 
    awk -v val=$1 '{print $val}' list.txt
}
Run Code Online (Sandbox Code Playgroud)

以上是$1通过传递给函数返回列匹配。如果您确实需要$1从函数中打印与行号匹配的行,请改用下面的。

function get_row
{ 
    awk -v val=$1 'NR==val{print ; exit}' list.txt
}
Run Code Online (Sandbox Code Playgroud)

或者让 shell 评估并设置val值并打印awk如下:

function get_column
{ 
    awk '{print $val}' val=$1 list.txt
}
Run Code Online (Sandbox Code Playgroud)
function get_row
{ 
    awk 'NR==val{print ; exit}' val=$1 list.txt
}
Run Code Online (Sandbox Code Playgroud)

在这里,你是路过val,只有数字和是否val为包含反斜杠转义字符,你会遇到一个问题,awk的确C转义序列处理上通过传递的值-v val=和一个shell变量与val="\\n"将变为值与\nAWK


cuo*_*glm 5

您可以使用:

field=$1 awk '{print $ENVIRON["field"]}'
Run Code Online (Sandbox Code Playgroud)

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

此外,该函数应命名get_columnget_row.