2014-03-13 38 views
2

我有一個文件,其中包含多個帶逗號的單詞。我想讀取一個文件並將這些單詞存儲到數組中。在這個文件中,第一行是標題,其他行是基準。但是有些數據是空的。所以,這個空字符需要爲0。在讀取文件bash時將分詞存儲到數組中

H1;H2;H3;H4 
12;23;33;44 
44;;7;8 
13;;;9 

因此,我想跳過第一行,並把基準成4陣列=>

H1 array= 12;44;13 
H2 array= 23;0;0 
H3 array= 33;7;0 
H4 array= 44;8;9 

所以我的代碼就是這樣:

array=() 
awk 'NR>1' $filename2 | while read line 
do 
    cntr=0 
    IFS=";" 
    for i in $line; do 
     if [ -z $i ]; then array[cntr]=0; 
      else array[cntr]=$i; 
     fi 
    cntr=$[$cntr +1] 
    done 
    h1array+=("${array[0]}") 
    h2array+=("${array[1]}") 
    h3array+=("${array[2]}") 
    h4array+=("${array[3]}") 
done 
for ((i=0;i<3;i++)); do 
    echo "${h1array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h2array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h3array[$i]}" 
done 
for ((i=0;i<3;i++)); do 
    echo "${h4array[$i]}" 
done 

所以,它打印在終端空。我怎樣才能做到這一點?謝謝

+0

那麼,你*實際*想要做的是用'0'填充空記錄? –

+0

是的,並將此值添加到數組0 – lowcosthighperformance

+0

你不需要一個數組。你甚至不需要'bash',你可以在'awk'的一行中做到這一點。你真的想達到什麼樣的目標(你想解決的問題)? –

回答

3

這是你在追求什麼?

#!/bin/bash 

while read -r line; do 
     [[ "${line}" == *';'* ]] || continue 
     IFS=';' read -r h1 h2 h3 h4 <<< "${line}" 
     h1array+=("${h1:-0}") 
     h2array+=("${h2:-0}") 
     h3array+=("${h3:-0}") 
     h4array+=("${h4:-0}") 
done < <(tail -n +2 input.txt) 

echo "h1array = ${h1array[@]}" 
echo "h2array = ${h2array[@]}" 
echo "h3array = ${h3array[@]}" 
echo "h4array = ${h4array[@]}" 

$ ./t.sh 
h1array = 12 44 13 
h2array = 23 0 0 
h3array = 33 7 0 
h4array = 44 8 9 
+2

只是爲了解釋:'awk'NR> 1'$ filename2 |而讀'產生一個子外殼&數組在子外殼中創建/填充。 – anishsane

+1

好吧,我已經把文件末尾的空格:)非常感謝你。它現在的作品:) – lowcosthighperformance

+0

我改編的解決方案,跳過不包含';'而不是';'更強健:-) –

相關問題