【问题标题】:How to keep spaces in strings when converting to an array in bash?在bash中转换为数组时如何在字符串中保留空格?
【发布时间】:2019-09-16 07:51:59
【问题描述】:

我目前正在使用 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

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

我该如何解决这个问题?

【问题讨论】:

  • 您需要将它们放在一个数组中,还是只需要显示的输出?
  • 我实际上需要将它们放在一个数组中!

标签: arrays bash awk


【解决方案1】:
mapfile -t myarr < <(awk -F, '{print $2}' filename.csv)
declare -p myarr

输出:

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

见:help mapfilehelp declare

【讨论】:

    【解决方案2】:

    如果你想要 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
    

    【讨论】:

    • 您好,感谢您的回答。当使用declare 时,我可以看到数组看起来像我想要的那样。但是当我使用之前使用的相同 for 循环对其进行迭代时,我仍然得到错误的输出(“ABC DEF”打印在两个单独的行中)。
    • 查看这个关于如何迭代数组的答案:stackoverflow.com/a/8880633/548225 确保你正确引用它,如答案所示。
    • 我添加了用于循环数组的示例代码。如果有任何问题,请告诉我。
    【解决方案3】:

    您也可以简单地将整行读入数组,然后删除第一个字段。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2021-08-31
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2016-02-10
      相关资源
      最近更新 更多