如何在UNIX中向数组写入awk命令的输出?

时间:2014-11-18 13:54:12

标签: arrays bash unix awk

我有一个包含以下内容的平面文件

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。

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中。