我的文件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
值。有什么错误吗?
您的代码有几个问题。
awk
程序用单引号括起来(建议这样做),因此不会发生 shell 参数扩展,并且您的语句print $[i]
将不起作用。请参阅StackOverflow上有关如何在awk
程序中使用 shell 参数的详尽问答。awk
编号存储在 ( awk
) 变量中的字段n
将通过$n
而非寻址$[n]
。val1
给val4
但从未实际使用它们,因此脚本示例的第一部分不执行任何操作。${val[i]}
, not $val[i]
(这将打印变量的内容$val
- 空字符串 - 后跟固定字符串[i]
)。还有一些效率低下的问题,例如重复调用awk
和(据我所知)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
调用将分割 line 的第二个“字段” Thread 1/1/25/100
,即在数组中的1/1/25/100
部分,并打印/
数组的a
所有条目,由OFS
(默认为空格)分隔。awk
程序的输出,并且 - 因为它是一个以空格分隔的标记列表 -val
通过该val=( ... )
语句将各个标记分配给一个数组变量。您可能希望在GNU Bash 参考手册或GreyCat&Lhunath 的 Bash 指南中进一步阅读 bash 数组。我还建议您查看shellcheck来调试您的 shell 脚本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句