使用bash将换行符分隔的字符串存储到数组中

时间:2013-03-17 22:15:44

标签: arrays bash command-line scripting sh

我有以下代码

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

数据由

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

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

列之间有标签,第3列只有空格。

我想要

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

这是cut的输出

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

默认情况下,

会在空格或制表符上拆分列(这可能不仅仅是其中之一),而且它更适合具有混合列分隔符的文件。

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表示
相关问题