【问题标题】:Storing newline separated strings into array with bash使用bash将换行符分隔的字符串存储到数组中
【发布时间】:2013-03-06 04:51:56
【问题描述】:

我有以下代码

tasks=$(cut ~/.todo/data -f3)

数据包括

1331956800  29  task 5
1361077200  28  task 3
1363554894  26  task 1
1363555119  30  baller

出于某种原因,我可以使用此方法提取前两列,但第三列似乎无法正常工作。我尝试在tasks= 之前设置IFS='\n',但它仍然无法正常工作。

列之间有制表符,第 3 列只有空格。

我想要

${tasks[0]} = "task 5"
${tasks[1]} = "task 3"
...
${tasks[3]} = "baller"

这里是cut的输出

$ cut ~/.todo/data -f3
task 5
task 3
task 1
baller

【问题讨论】:

    标签: arrays bash command-line scripting sh


    【解决方案1】:

    简单的 bash 解决方案。

    tasks=()
    while IFS=$'\t' read _ _ t; do
            tasks+=("$t")                                                       
    done <<-!
            1331956800      29      task 5
            1361077200      28      task 3
            1363554894      26      task 1
            1363555119      30      baller
    !
    
    for t in "${tasks[@]}"; do
            echo "$t"
    done
    

    【讨论】:

      【解决方案2】:
      readarray a < <(awk '{print "\047" $3, $4 "\047"}' file.txt)
      for i in ${!a[@]}; do echo "index[$i]=${a[i]}"; done
      

      编辑:您的问题在线程中增长,所以

      readarray a < <(
          awk '{$1=$2=""; sub(/^ +/, ""); print "\047" $0 "\047"}' ~/.todo/data
      )
      

      \047
      

      '的八进制ASCII表示

      【讨论】:

      • 我在使用 find 读取带空格的文件名时遇到了同样的问题,我该如何解决?
      • 我猜是$3=="task" 而不是$4
      • @JohnLotacs,“列之间有制表符,第 3 列只有空格。”完全没有意义,空格是列之间
      • 这并不能解决我的问题,这只是返回整数,我需要整个字符串,“task 3”“task 2”...“baller”
      • 文件是TAB分隔的,cut -f3 ~/.todo/data返回一列字符串“task 3\ntask 2\ntask 1\nballer”,我想要bash数组中的每一行。我编辑了我的问题,使其更具体。
      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 2019-08-23
      • 2020-05-08
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多