我试图通过传递int命令来打印特定列中的数据。
我尝试过使用"-v"设置是可变的,但它考虑"$"作为字符串。我的分隔符是特殊字符^A (ctrl+v+a)。
vi test_file.dat
a^Ab^Ac^Ad^Ae^Af^Ag^Ah^Ai^Aj^Ak^Al^Am^An^Ao^Ap工作代码
awk -F'^A' '{print $2,$5,$7}' test_file.dat这是印刷
b e g但如果我试着
export fields='$2,$5,$7'
export file='test_file.dat'
awk -v sample_file="$test_file.dat" -v columns="$fileds" -F'^A' '{print columns}' sample_file这是印刷
$2 $5 $7我期望输出
b e g并且我希望将分隔符、列、文件名作为参数传递,如
export fields='$2,$5,$7'
export file='test_file.dat'
export delimiter='^A'
awk -v sample_file="$test_file.dat" -v columns="$fields" -v file_delimiter="$delimiter" -F'file_delimiter' '{print columns}' sample_file发布于 2019-08-12 04:43:15
在awk中,$符号实际上是一个以字段号为参数的运算符。字段名是表达式,这就是为什么$NF用于表示最后一个字段:NF是由$运算符计算的。所以正如你所看到的,我们不应该在字段名中包含美元符号。
如果您使用环境将材料传递给Awk,那么正确的做法是让Awk从环境中捡起它。
可以使用ENVIRON关联数组访问环境。如果一个名为delimiter的变量持有字段分隔符,我们可能会执行如下操作
BEGIN { FS = ENVIRON["delimiter"] }在Awk密码里。然后,我们将不再处理新一轮的shell参数插值问题。
我们也可以得到类似的字段号。可以使用split函数将它们放入数组中。请参阅以下一行:
$ fields=1,3,9 awk 'BEGIN { split(ENVIRON["fields"], f, ",") ;
for (i in f)
printf("f[%d] = %d\n", i, f[i]) ; }'
f[1] = 1
f[2] = 3
f[3] = 9表达式length(f)给出了字段的数目。
https://stackoverflow.com/questions/57455321
复制相似问题