我正在努力使用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]}
答案 0 :(得分:1)
Bash管道创建一个子shell,其中更新的变量根本不会反射。在您的情况下,在子shell终止后,您的数组array
和counter
变量范围中的任何一个都会丢失。在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)