以下简单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
传递给函数。如果您确实需要在$1
from 函数中打印与行号匹配的行,请改为使用下面的内容。
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"
将更改为\n
by的值awk。
答案2
您可以使用:
field=$1 awk '{print $ENVIRON["field"]}'
它适用于所有 POSIX 兼容的系统,使用时不必担心代码注入-v val=
此外,该函数应该命名get_column
而不是get_row
.