2012-11-01 21 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命令生成。

相关问题