我试图用来awk
打印由 分隔的行中各个列的变量 ,
。我想要打印的列和模式存储在另一个变量中b
。图案a
和印刷图案b
如下:
a='15986327,415532694,850257614,875121642,20140819'
b='$1","$2","$4'
我正在尝试获得如下输出。
15986327,415532694,875121642
我正在尝试使用 switch 将模式传递b
给 awk-v
但不确定如何在print
inside 中使用它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}"
相反,它将b
in 作为表达式的一部分进行替换awk
。
综上所述,您不需要awk
这个。这确实是一份工作cut
:
echo "$a" | cut -d, -f1,2,4
它选择字段 1、2 和 4,用作,
字段分隔符,无需对代码进行复杂的双重解析。这正是cut
我们设计的目的。