Bash(v.2.03)捕获awk输出到数组不工作

时间:2017-09-08 13:11:32

标签: bash awk

我正在努力使用awk,并希望将由分隔符分隔的awk输出保存到数组中。所以只是让这个工作:

array[index]=$line

在所需文件中的分隔符$line之间'[[:blank:]]{2,}'值相等。

我尝试过多种解决方案,如:

myarr=$(/usr/xpg4/bin/awk -F '[[:blank:]]{2,}' 'FNR > 4 { for (i=1; i<=NF; i++) if ($i != "") print $i;}' my-file)

array=()
counter=0
/usr/xpg4/bin/awk -F '[[:blank:]]{2,}' 'FNR > 4 { for (i=1; i<=NF; i++) if ($i != "") print $i;}' my-file | while read -r line; do
    array[counter]=$line
    counter=$((counter+1))
done

echo ${#array[@]}
echo ${array[1]}

它们都没有产生预期的结果。但是当我修改第二种情况并且echo $line$counter我得到数组时,但对于大文件不是这样,我只是不想输出整条线到控制台让我的阵列充满 - 这对我没有意义:

这有效 - &gt;但是大文件的表现不佳/糟糕

array=()
counter=0
/usr/xpg4/bin/awk -F '[[:blank:]]{2,}' 'FNR > 4 { for (i=1; i<=NF; i++) if ($i != "") print $i;}'my-file | while read -r line; do
    echo $line
    echo $counter
    array[counter]=$line
    counter=$((counter+1))
done

echo ${#array[@]}
echo ${array[1]}

1 个答案:

答案 0 :(得分:1)

BashFAQ/024 - 我在一个管道中的循环中设置变量。它们为什么在循环结束后消失?或者,为什么我不能管道数据来读取?

Bash管道创建一个子shell,其中更新的变量根本不会反射。在您的情况下,在子shell终止后,您的数组arraycounter变量范围中的任何一个都会丢失。在bash中使用process-substitution(<( … )),如下所示

您使用的数组下标也是错误的;本应以

完成
array[$counter]="$line"

结合两者,

while read -r line; do
    echo "$line"
    echo "$counter"
    array[$counter]="$line"
    counter=$((counter+1))
done < <(/usr/xpg4/bin/awk -F '[[:blank:]]{2,}' 'FNR > 4 { for (i=1; i<=NF; i++) if ($i != "") print $i;}' my-file)