将打印模式作为变量传递给 awk

将打印模式作为变量传递给 awk

我试图用来awk打印由 分隔的行中各个列的变量 ,。我想要打印的列和模式存储在另一个变量中b。图案a和印刷图案b如下:

a='15986327,415532694,850257614,875121642,20140819'
b='$1","$2","$4'

我正在尝试获得如下输出。

15986327,415532694,875121642

我正在尝试使用 switch 将模式传递b给 awk-v但不确定如何在printinside 中使用它awk。尝试了以下命令,但这不是我想要得到的输出。

echo $a |awk -v ba="${b}" -F"," '{print ba}'
$1","$2","$4

echo $a |awk -v ba="${b}" -F"," '{print $ba}'
15986327,415532694,850257614,875121642,20140819

答案1

您不需要使用变量ba,尝试:

$ echo $a | awk -F',' '{print '"$b"'}'
15986327,415532694,875121642

这样,$b是由 shell 扩展的,而不是由awk.语句的其余部分awk不受影响,因为它们用单引号引起来。

答案2

awk变量仅用于它们的值,就像大多数语言中的变量一样 - 它们不会被重新解析为表达式。你可以用这个做你想做的事:

a='15986327,415532694,850257614,875121642,20140819'
echo $a | awk -F, -v OFS=, '{print $1, $2, $4}'

(设置OFS以便在输出中得到逗号)。如果b需要作为变量,您可以使用:

b='$1, $2, $4'
echo $a | awk -F, -v OFS=, "{print $b}"

相反,它将bin 作为表达式的一部分进行替换awk


综上所述,您不需要awk这个。这确实是一份工作cut:

echo "$a" | cut -d, -f1,2,4

它选择字段 1、2 和 4,用作,字段分隔符,无需对代码进行复杂的双重解析。这正是cut我们设计的目的。

相关内容