我正在尝试将一系列直线HQL查询的输出存储到一个数组中,以便我可以解析它以提取有趣的位。这是相关的代码:
#!/usr/bin/env ksh
ext_output=()
while IFS= read -r line; do
ext_output+=( "$line" )
done < <( bee --hiveconf hive.auto.convert.join=false -f temp.hql)
bee
只是使用JDBC url等完整beeline命令的别名.Temp.hql是多个hql查询。
以下是每个查询输出结果的片段:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
| tableName:myTable |
| owner:foo |
| location:hdfs://<server>/<path>...
<big snip>
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--+
15 rows selected (0.187 seconds)
问题是,我的数组只从每个结果中获取最后一行(选择了15行(0.187秒)。
我在这里做错了吗?完全相同的方法在其他情况下有效,所以我真的不明白。
答案 0 :(得分:2)
嗯,我对您发布的代码没有任何问题。
如果我在代码中进行以下更改,可以重现我认为您可能会看到的内容(即数组包含由输出的最后一行组成的单个值):
# current/correct code - from your post
ext_output+=( "$line" )
# modified/wrong code
ext_output=+( "$line" )
注意加号(+
)的位置:
+=
)的左侧时,每个$行都附加到数组的末尾(参见下面的示例运行)=+
)的右侧时,每个$行被分配给数组中的第一个槽(index = 0);加号(+
)和parens(()
)被视为要存储在数组中的数据的一部分(参见本文底部的示例运行)在您正在投放的内容(以及错误的&#39;结果)与您在此帖子中发布的内容之间是否存在拼写错误(以及您提到的内容会产生的错误)其他情况下的正确结果)?
以下是我运行您发布的代码时获得的结果(等号左侧的加号:+=
)...
注意:我已经用包含您的采样线和一对(伪造)数据线的输出文件替换了bee / HCL调用;为了便于阅读,还缩短了较长的行:
$ cat temp.out
-----------------------------------------+--+
| tableName:myTable
| owner:foo
| location:hdfs://<server>/<path>...
abc def ghi
123 456 789
-----------------------------------------+--+
15 rows selected (0.187 seconds)
然后我针对temp.out运行你的代码:
ext_output=()
while IFS= read -r line
do
ext_output+=( "$line" )
done < temp.out
阵列上的一些统计数据:
$ echo "array size : ${#ext_output[*]}"
array size : 10
$ echo "array indx : ${!ext_output[*]}"
array indx : 0 1 2 3 4 5 6 7 8 9
$ echo "array vals : ${ext_output[*]}"
array vals : -----------------------------------------+--+ | tableName:myTable | owner:foo | location:hdfs://<server>/<path>... abc def ghi 123 456 789 -----------------------------------------+--+ 15 rows selected (0.187 seconds)
转储数组的内容:
$ for i in ${!ext_output[*]}
> do
> echo "${i} : ${ext_output[$i]}"
> done
0 : -----------------------------------------+--+
1 : | tableName:myTable
2 : | owner:foo
3 : | location:hdfs://<server>/<path>...
4 :
5 : abc def ghi
6 : 123 456 789
7 :
8 : -----------------------------------------+--+
9 : 15 rows selected (0.187 seconds)
如果我修改您的代码,将加号放在等号(=+
)的右侧......
ext_output=()
while IFS= read -r line
do
ext_output=+( "$line" )
done < temp.out
......数组统计信息:
$ echo "array size : ${#ext_output[*]}"
array size : 1
$ echo "array indx : ${!ext_output[*]}"
array indx : 0
$ echo "array vals : ${ext_output[*]}"
array vals : +( 15 rows selected (0.187 seconds) )
......以及数组的内容:
$ for i in ${!ext_output[*]}
> do
> echo "${i} : ${ext_output[$i]}"
> done
0 : +( 15 rows selected (0.187 seconds) )
!!请注意,加号和parens是ext_output[0]