在bash中转换为数组时如何在字符串中保留空格?

时间:2019-04-26 19:13:48

标签: arrays bash awk

我目前正在使用bash脚本。我有一个csv文件,其中的每一行都如下所示:

1,ABC DEF
2,GHI JKL

我想创建一个仅在第二个字段中包含值的数组,然后打印它们。

我当前的解决方法如下:

myarr=($(awk -F, '{print $2}' filename.csv))
for i in "${myarr[@]}" 
do
    echo $i
done

我的输出如下:

ABC
DEF
GHI
JKL

当我需要它看起来像这样时:

ABC DEF
GHI JKL

我需要将结果保存在变量中以供将来操作!

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

如果要在shell数组中使用值,请不要使用awk。只需使用这样的循环:

arr=()
while IFS=, read _ val; do
   arr+=("$val")
done < file

# check array content
declare -p arr
declare -a arr='([0]="ABC DEF" [1]="GHI JKL")'

# loop through array
for i in "${arr[@]}"; do
   echo "$i"
   # or do whatever with individual element of the array
done

答案 1 :(得分:3)

mapfile -t myarr < <(awk -F, '{print $2}' filename.csv)
declare -p myarr

输出:

declare -a array='([0]="ABC DEF" [1]="GHI JKL")'

请参阅:help mapfilehelp declare

答案 2 :(得分:2)

您还可以简单地将整行读取到数组中,然后 剥离第一个字段。

mapfile -t myarr < filename.csv
myarr=("${myarr[@]#*,}")