以下简单的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设置为awk '{print $val}'变量,以便如果我将函数调用为get_row 1,变量$val将获得值1?
发布于 2018-04-24 11:30:35
你想要这样的东西吗?
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原含backslash转义字符你会遇到问题,awk对通过-v val=传递的值执行C转义序列处理,带有val="\\n"的shell变量将通过awk更改为\n值。
发布于 2018-04-24 11:40:05
您可以使用:
field=$1 awk '{print $ENVIRON["field"]}'它适用于所有POSIX兼容的系统,并且在使用-v val=时不必担心代码注入
另外,函数应该命名为get_column,而不是get_row。
https://unix.stackexchange.com/questions/439710
复制相似问题