2010-10-11 15 views
0

輸入文件格式:拿起特定組線

<Tariff> 
<AA>10030</AA> 
<AA>100</AA> 
</Tariff> 
<Tariff> 
<AA>30004</AA> 
<AA>30001</AA> 
</Tariff> 
<Tariff> 
<AA>Account division</AA> 
<AA>AIR</AA> 
<AA>AA</AA> 
<AA>10039</AA> 
</Tariff> 

輸出格式: 輸出應在「<\Tariff>」「<Tariff>」 &有結束標記也開放標籤的方式來對準用逗號分隔符分隔。

輸出:

<Tariff>,<AA>10030</AA>,<AA>100</AA>,</Tariff> 
<Tariff>,<AA>30004</AA>,<AA>30001</AA>,</Tariff> 
<Tariff>,<AA>Account division</AA>,<AA>AIR</AA>,<AA>AA</AA>,<AA>10039</AA>,</Tariff> 
+2

很難看你問什麼有,小心改寫這個問題? – Tim

+0

很難看到什麼是如此難以看到:-)輸入和輸出應該是一個死的贈品,以真實需要什麼。發問者希望關稅部分用逗號分隔符摺疊成一行。投票重新開放。 – paxdiablo

回答

0
vim -U file.txt -c 'g/^<Tariff>$/ .,/^<\/Tarrif>$/ - 1 s/$/,/' -c 'g/^<Tariff>,$/ .,/^<\/Tarrif>$/ join!' -c 'wq' 

如果你的關稅標籤是獨自在自己的線路沒有標題,也沒有尾隨空格纔有效。

希望你會開始接受的答案。

3

這是很容易用一個簡單的XSLT:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="Tariff"> 
    <Tariff> 
     <xsl:text>,</xsl:text> 
     <xsl:apply-templates /> 
     <xsl:text>,</xsl:text> 
    </Tariff> 
    </xsl:template> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
0

您可以使用awk腳本來做到這一點,如下圖所示:

pax> echo '<Tariff> 
<AA>10030</AA> 
<AA>100</AA> 
</Tariff> 
<Tariff> 
<AA>30004</AA> 
<AA>30001</AA> 
</Tariff> 
<Tariff> 
<AA>Account division</AA> 
<AA>AIR</AA> 
<AA>AA</AA> 
<AA>10039</AA> 
</Tariff>' | awk ' 
    { 
     if ($0=="</Tariff>") { 
      printf "</Tarrif>\n" 
     } else { 
      printf $0"," 
     } 
    }' 

<Tariff>,<AA>10030</AA>,<AA>100</AA>,</Tarrif> 
<Tariff>,<AA>30004</AA>,<AA>30001</AA>,</Tarrif> 
<Tariff>,<AA>Account division</AA>,<AA>AIR</AA>,<AA>AA</AA>,<AA>10039</AA>,</Tarrif> 

這就是很好的格式化版本,快速版本:

awk '{if ($0=="</Tariff>") {printf "</Tarrif>\n"} else {printf $0","}}' infile 

請記住,這是您的輸入文件格式的特定解決方案。 XML文件,一般應與特定的工作工具來處理,因爲quick'n'dirty解決方案將打破當輸入格式的變化(例如,如果你的結束標記不在行自己的,不帶空格兩側,或如果你有一個包含兩個關稅部分的遏制線)。

但是,如果象你所說的,你的輸入文件格式限制的quick'n'dirty解決方案通常會比努力學習如何使用XML轉換工具速度更快。有時候取決於你是否要完成工作,或做現在

0
$ awk 'ORS=(/<\/Tariff>/) ?"\n":","' file 
<Tariff>,<AA>10030</AA>,<AA>100</AA>,</Tariff> 
<Tariff>,<AA>30004</AA>,<AA>30001</AA>,</Tariff> 
<Tariff>,<AA>Account division</AA>,<AA>AIR</AA>,<AA>AA</AA>,<AA>10039</AA>,</Tariff>