0

次のコードがあります

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

データは以下で構成されています

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

何らかの理由で、この方法で最初の 2 つの列を抽出できますが、3 番目の列は正しく機能していないようです。IFS='\n'以前に設定を試みtasks=ましたが、それでも機能しません。

列の間にはタブがあり、列 3 にはスペースのみがあります。

私が欲しい

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

これがカットの出力です

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

2 に答える 2

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
于 2013-03-18T13:55:49.497 に答える
0

は、デフォルトでスペースまたはタブ (これらのうちの 1 つ以上である可能性があります) で列を分割し、列区切り文字が混在するファイルにより適しています。

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

の 8 進 ASCII 表現です。'

于 2013-03-17T22:27:43.660 に答える