我的文件Threadout.txt
包含类似Thread 1/1/25/100
val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')
for((i=1;i<5;i++))
do
val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')
echo $val[i]
done
我已经尝试过这个数组,但没有给出正确的结果,例如1 1 25 100
值。有错误吗?
答案1
您的代码有几个问题。
- 首先要记住的重要事情是,由于您的
awk
程序用单引号引起来(建议这样做),因此不会发生 shell 参数扩展,并且您的语句print $[i]
将不起作用。看到这个StackOverflow 上详尽的问答关于如何在awk
程序中使用 shell 参数。 - 即便如此,
awk
其编号存储在 (awk
) 变量中的字段n
将通过$n
,而不是 来寻址$[n]
。 val1
您分配了变量val4
但从未实际使用它们,因此脚本示例的第一部分不执行任何操作。- 最后,要取消引用数组变量,您必须声明
${val[i]}
, not$val[i]
(这将打印变量的内容$val
- 空字符串 - 后跟固定字符串[i]
)。
还有一些效率低下的问题,例如重复调用awk
and (据我所知)在仅用作字段分隔符Thread
时无法解决示例输入中的前导问题。/
要解决这些问题,并且由于示例中相关值不包含空格,请尝试以下操作:
#!/bin/bash
val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )
for i in ${!val[@]}
do
echo "${val[i]}"
done
- 该
awk
调用将分割该行的第二个“字段”Thread 1/1/25/100
,即1/1/25/100
位于/
数组中的部分a
,并打印数组的所有条目,以OFS
(默认为空格)分隔。 - shell 脚本将获取该程序的输出- 因为它是一个以空格分隔的标记列表 -通过语句
awk
将各个标记分配给一个数组变量。val
val=( ... )
- 然后它将迭代数组索引并打印数组值。
您可能想进一步阅读 bash 数组GNU Bash 参考手册, 或者GreyCat&Lhunath 的 Bash 指南。我还建议您看一下外壳检查调试您的 shell 脚本。