2016-10-24 38 views
0

我有一個shell腳本,它現在輸出信息。輸出格式爲:在輸出中給出cellname和value時填充csv的單元格

cellname1 
cellvalue1 
cellname2 
cellvalue2 
... 

棘手的部分是,在多組不同cellnames數據的這個腳本迭代(總是少數比賽,幾個比賽有時...)。我也不知道cellname的所有可能值。 因此,腳本應該通過查看單元名稱並將值放入此單元格中來識別正確的單元格。 當第一次出現單元名稱時,它應該只是作爲新列添加。

輸出示例:

cellname1, cellname2, cellname3 # not necessarily needed since i can add them at the end 
value1, value2, value3 
foo1, foo2, foo3 
bar1, bar2, bar3, bar4 # <-- see the new value here 

我還是新的bash和欣賞這裏

+0

請,顯示對應於樣本輸出的輸入,目前還不清楚發生了什麼事情。你怎麼知道CSV中的新行應該開始? – choroba

+0

該腳本循環播放數據集,以便知道一個集合完成並且下一個開始時 – Fuzzyma

回答

1

訣竅是環通的數據兩條線在任何時間幫助;將值存儲到數組;然後在最後輸出一個csv(如果你希望你可以在if [ -z "$name" ]塊中打印輸出,但是你鬆開了漂亮的標題)。

#!/bin/bash 
declare -A cell 
declare -A head 

i=0 
while read name 
do 
    if [ -z "$name" ] 
    then 
     ((i+=1)) 
    else 
     head[$name]=$name 
     read value 
     cell[$i,$name]=$value; 
    fi 
done < "${1:-/dev/stdin}" 

printf "%-10s; " "${head[@]}"; echo 
printf "%.0s----------; " ${head[@]}; echo 

j=0 
until [ $j -gt $i ]; do 
    for name in ${head[@]} 
    do 
     printf "%-10s; " "${cell[$j,$name]}" 
    done 
    echo 
    ((j+=1)) 
done 

上述腳本假定該組由單一的空行分離,將返回:

$ head data 
head1 
value1-1 
head2 
value2-1 

head2 
value2-2 

$ ./csvgen.sh data 
head2  ; head3  ; head1  ; head4  ; 
----------; ----------; ----------; ----------; 
value2-1 ;   ; value1-1 ;   ; 
value2-2 ; value3-2 ;   ;   ; 
value2-3 ;   ; value1-3 ; value4-3 ; 

工作原理:

loop over each line of either a file or stdin

while read name 
do 
# ... 
done < "${1:-/dev/stdin}" 

if [ -z "$name" ] # If the line has a length of zero the set has ended 
then    # so increse the set index by 1. 
    ((i+=1)) 
else 
    head[$name]=$name # this array contains all the headers we have seen 
    read value # read the next line to $value 
    cell[$i,$name]=$value; # save $value in array indexed by set and header 
fi 

printf "%-10s; " "${head[@]}"; # print each header from 
echo # the above wont end the line so echo for a "\n" 

printf "%.0s----------; " ${head[@]}; # %.0s truncates the input to nothing 
echo         # printing only the '----------' 

until [ $j -gt $i ]; do  # for each set index 
    for name in ${head[@]} # loop thru the headers 
    do 
     printf "%-10s; " "${cell[$j,$name]}" # then print the values 
    done 
    echo # end each set with "\n" 
    ((j+=1)) 
done 
+0

這就是_exactly_我​​正在查找的內容。即使是分開的分離比賽。這將是很好,如果你可以添加一些意見的代碼,以便我可以理解 – Fuzzyma

+0

沒問題,答案更新。 bash對於文本處理並不是那麼好,向前推進你可能會想看看perl或者awk這些類型的作業...... –