2012-11-01 22 views
1

對於模糊的標題和標籤很抱歉,因爲這個問題很具體。腳本這個重複性任務的最佳方式是什麼?

我不是一個大的scripter或編碼器在任何方式。我運行一個網站,每週需要更新一些結果。結果由特殊軟件創建並以這些格式中的任何一種格式導出; html,pdf,doc,xls,rpt,ttx,csv,odbc,rec,rtf或xml。

由於我的網站使用的表格與導出的文件有不同的佈局,因此我目前在my和tags之間複製並粘貼信息。我只需要幾分鐘,但我想知道如何自動執行此操作?導出的文件是這樣的:

1 John and George 12 
2 Peter and Suzan 10 
3 Allan and Ed  8 

,需要在此行中somesthing:

<table width="100%" cellspacing="0" class="tabels" id="top"> 
<tr> 
<td colspan="3" class="tabel"><b> Groupp A</b></td> 
</tr> 
<tr> 
<td class="tabel"><strong> 1. </strong></td> 
<td class="tabel">John and George</td> 
<td class="tabel">12</td> 
</tr> 
<tr> 
<td class="tabel"><strong>2.</strong></td> 
<td class="tabel">Peter and Suzan</td> 
<td class="tabel">10</td> 
</tr> 
<tr> 
<td class="tabel"><strong> 3. </strong></td> 
<td class="tabel">Allan and Ed</td> 
<td class="tabel">8</td> 
</tr> 

這可能是非常基本的。我想有幾個查找和替換命令應該可以做到。我曾嘗試使用Notepad ++,但我不知道你們會如何處理這個問題?我可以使用Linux或Windows機器。

+0

小錯字:「tabel」應該可以讀取「table」 –

+0

如果您只需要一次性解決方案,並且您恰好使用編輯器vim,則可以記錄命令並重復它們,請參閱':help 10.1', :help q',':help @'。 –

回答

0

我會用awk這樣的東西(儘管任何測試處理工具,比如Perl,都可以完成這個任務)。

首先輸入文件:

pax> cat testprog.in 

1 John and George 12 
2 Peter and Suzan 10 
3 Allan and Ed  8 

然後,awk腳本本身:

pax> cat testprog.awk 

BEGIN { 
    print "<table width=\"100%\" cellspacing=\"0\" class=\"tabels\" id=\"top\">" 
    print " <tr>" 
    print " <td colspan=\"3\" class=\"tabel\"><b> Groupp A</b></td>" 
    print " </tr>" 
} 
{ 
    print " <tr>" 
    print " <td class=\"tabel\"><strong>" $1 ".</strong></td>" 

    str = ""; for (i = 2; i < NF; i++) str = str " " $i 
    print " <td class=\"tabel\">" substr (str,2) "</td>" 

    print " <td class=\"tabel\">" $NF "</td>" 
    print " </tr>" 
} 
END { 
    print "</table>" 
} 

然後,一個樣品運行,所以你可以看到它的工作:

pax> awk -f testprog.awk testprog.in 

<table width="100%" cellspacing="0" class="tabels" id="top"> 
    <tr> 
    <td colspan="3" class="tabel"><b> Groupp A</b></td> 
    </tr> 
    <tr> 
    <td class="tabel"><strong>1.</strong></td> 
    <td class="tabel">John and George</td> 
    <td class="tabel">12</td> 
    </tr> 
    <tr> 
    <td class="tabel"><strong>2.</strong></td> 
    <td class="tabel">Peter and Suzan</td> 
    <td class="tabel">10</td> 
    </tr> 
    <tr> 
    <td class="tabel"><strong>3.</strong></td> 
    <td class="tabel">Allan and Ed</td> 
    <td class="tabel">8</td> 
    </tr> 
</table> 

由於到它如何工作,這在下面解釋。

BEGINEND子句只是簡單地控制在處理輸入文件中的行之前和之後打印的內容。這就是桌子本身和第一排。

對於每一行,首先打印一個tr標記和一個td標記,其中包含行上的第一個單詞。

然後,根據中間參數構建另一個td行,在進程中摺疊空格。

最後的td與最後一個參數在線,並關閉tr,那裏你有它。轉到下一行。

+0

感謝您的回覆。最近幾天我一直在搞awk,非常有趣。我正在慢慢學習如何使用它。我仍然有幾個問題。我使用以下行: '{if(NR = $ 1 <4){print「」$ 1「」$ 4「」$(NF-1)「」};}' 僅打印前三個分數。有時,有兩個人同分和輸入將是: '1皮特 2阿蘭 (3)約翰 (3)Charles' 有一個聰明的辦法來只顯示前兩個(約翰在這種情況下)? – user1788586

+0

@ user1788586,是的,有。但是,如果您將其作爲單獨問題提出,您會得到更好的回覆。這樣,SO羣的全部力量就會以答案的形式降臨在你身上,並且將來會更好地幫助其他人解決類似的問題。 – paxdiablo

0

這裏是一個Linux sed解決方案:

sed 's|\([0-9]*\) *\(.*[^ ]\) *\([0-9]*\)$|<tr><td class="tabel"><strong>\1.</strong></td><td class="tabel">\2</td><td class="tabel">\3</td></tr>|' filename > filename.html 

這只是處理與表中的行。其他一切看起來都像是靜態樣板文件,您應該可以在腳本中使用echo命令生成。

相關問題