2009-07-29 86 views
0

我正在編寫bash腳本以從procmail獲取數據並生成輸出CSV文件。列到行使用sed編譯

最後,我需要從這個翻譯:

---label1: 123456 
---label2: 654321 
---label3: 246810 
---label4: 135791 
---label5: 101010 

這樣:

label1,label2,label3,label4,label5 
123456,654321,246810,135791,101010 

我可以用一個ruby腳本做到這一點很容易,但我不想調用另一個除bash腳本以外的其他腳本。所以我儘管用sed來做。

我可以提取我想是這樣的數據:

sed -nr 's/^---(\S+): (\S+)$/\1,\2/p' 

但我不知道怎麼調換它。你可以幫我嗎?

+0

-r輸出重定向到CSV文件是非標準的 – 2009-07-29 10:20:18

+0

我不明白你不使用Ruby的原因。您希望避免使用腳本語言,因此您使用兩種語言。你的腳本將會發展壯大,在你知道它之前,會有遍佈各處的循環和tr以及awk和sed調用。 如果不是現在,使用正確的CSV庫也可能有所幫助,然後在下一個有數據中有引號或逗號的工作上。 我不知道Ruby,但Perl有一個。 – reinierpost 2009-07-29 10:24:35

+0

問題是我不想要一個不同的文件,只需要一個bash腳本來處理。但是我發現了一種在bash腳本中使用ruby作爲線索的方法。 – chmeee 2009-07-29 11:07:45

回答

0

最後我決定使用Ruby它,建議購買戴維·韋布但作爲一個班輪不是在這裏與下面的腳本文件:

ruby -ne 'BEGIN{@head=[];@data=[]}; @head << $1 && @data << $2 if $_.match(/^---(\S+): (\S+)$/); END{puts @head.join(",");puts @data.join(",")}' $FILE 

我沒有知道我可以使用BEGIN,END塊來設置變量並輸出結果。

1

如果你正在運行sed我認爲你的調用另一個腳本。那麼爲什麼不把它寫在Ruby中,如果這更容易編寫和維護?

如果你擔心有多個文件可以嵌入Ruby代碼在bash腳本作爲here document(假設紅寶石可以從標準輸入讀劇本)。

0

也許這是你在找什麼? (從unix.com

num=$(awk -F"," 'NR==1 { print NF }' data) 
print $num 

i=1 
while (($i > tmpdata 
((i = i + 1)) 
done 
mv tmpdata data
0

你說你需要的bash腳本..

 
#!/bin/bash 
labels=`awk '/---/{printf("%s,",$1)}' file.txt ` 
values=`awk '/---/{printf("%s,",$2)}' file.txt ` 
labels=`echo $labels|sed 's/---//g;s/\://g;s/\,$//'` 
values=`echo $values|sed 's/\,$//` 
echo $labels 
echo $values 
0

您可以從shell腳本中做這樣的事情:

貓演示| awk -F':''{print $ 1}'| sed -e s /'---'// | tr'\ n'','> csv_file

cat demo | awk'{print $ 2}'| TR '\ n' '' >> csv_file

1

你可以做一切AWK

awk 'BEGIN{ 
    FS=": " 
} 
{ 
    gsub("---","") 
    label[++c] = $1 
    num[++d] =$2 
} 
END{ 
    for(i=1;i<c;i++){ 
     printf label[i]"," 
    } 
    print label[c] 
    for(i=1;i<d;i++){ 
     printf num[i]"," 
    } 
    print num[d]  
}' file 

輸出

# ./test.sh 
label1,label2,label3,label4,label5 
123456,654321,246810,135791,101010 

需要