我有一个包含以下内容的平面文件
INDIA USA SA NZ AUS ARG GER BRA
所以共有八列。现在我想将那些以A开头的列的索引存储到一个数组中。 为此,我尝试了以下声明
awk '{for(i=1;i<=NF;i++){if($i~/^A/){set -A newArray $i}}}' testUnix.txt
当我使用
回显文件时echo "${newArray[*]}"
它正在打印5 6,但每当我想要获得该数组的长度时
echo ${#newArray[@]}
其长度仅显示为1。不应该是2吗? 我也试过
awk '{y = 0;for(i=1;i<=NF;i++){if($i~/^A/){newArray[y] = $i ; y++}}}' testUnix.txt
但它也产生了相同的结果。 我错过了什么?请解释一下。我打算得到所需的输出2。
答案 0 :(得分:1)
我要做的是拥有一个bash数组:
bash_arr=( $(awk '{for(i=1;i<=NF;i++){if($i~/^A/){print $i}}}' file) )
echo "${bash_arr[@]}"
AUS ARG
你实际上甚至不需要awk,bash能够做正则表达式:
for word in $(<file); do [[ $word =~ ^A ]] && basharr+=( "$word" ); done
答案 1 :(得分:1)
无需awk
。您可以遍历元素并检查它们是否以A
开头:
r="INDIA USA SA NZ AUS ARG GER BRA"
arr=()
for w in $r
do
[[ $w == A* ]] && arr+=("$w")
done
如果执行它,则arr
数组包含:
$ for i in "${arr[@]}"; do echo "$i"; done
AUS
ARG
要确认这有两个要素,让我们算一下:
$ echo "${#arr[@]}"
2
你的aproach发生了什么事?
awk '{for(i=1;i<=NF;i++){if($i~/^A/){set -A newArray $i}}}' testUnix.txt
这说set -A newArray
但它并没有真正在bash中定义变量,因为你在awk中。