2013-03-17 42 views
0

我有以下代码存储换行符隔开字符串成阵列的bash

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 ~/.todo/data -f3 
task 5 
task 3 
task 1 
baller 

回答

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 

'

+0

我遇到了同样的问题,用空格使用find来查看文件名,我该如何解决这个问题? – 2013-03-17 22:29:00

+0

我猜'$ 3 ==“任务”'而不是'$ 4'。 – fedorqui 2013-03-17 22:29:00

+1

谢谢fedorqui,相应编辑 – 2013-03-17 22:29:35

1

简单的bash解决方案的八进制ASCII码表示。

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