从文件中选取特定的一组行

时间:2010-10-11 08:33:51

标签: unix

输入文件格式:

<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>

4 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

仅当您的关税标签在他们自己的行上没有标题或尾随空格时才会起作用。

希望你能开始接受答案。

答案 2 :(得分: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文件通常应该使用特定于作业的工具来处理,因为当输入格式发生变化时,快速的解决方案将会中断(例如,如果您的结束标记不在他们自己的行上,并且任何一侧都没有空格,或者如果你有一个包含两个关税部分的罪行线。)

但是,如果您所描述的输入文件格式有限,那么快速的解决方案通常比尝试学习如何使用XML转换工具更快。它有时取决于您是否希望完成正确的,或者现在完成

答案 3 :(得分: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>