Awk递增变量两次计数12,615,766

我有一个巨大的XML表,其中包含706,255,441行和50,446,817行。

每行有14行,包括12列和2行,带有行的打开和关闭标签。

现在,这12列行之一是主键,它本质上是一个从1开始到50446817结束的计数器,或者至少是应该。取而代之的是,它以50,816结束,并且验证软件说有1个主键不是唯一的。

考虑到行号减去3(XML东西)再除以14等于50446817,我知道验证软件是正确的,为什么会这样?

我通过Cygwin终端使用的awk脚本是这样的:

awk '{print} sub(/<c11>.*/,""){print "<c12>"++cnt"</c12>"}' FILE

我知道脚本本身与整个子字符串无关,我没有awk技能,只能从另一个脚本中真正回收它。

再一次,问题在于递增变量++cnt在到达50,817的过程中似乎对相同的数字进行了两次计数,我已经确认它恰好是12,615,766。

以下类型的输入将不胜感激:

  • 实现该awk脚本意图执行的另一种方法(创建主键列)
  • 为什么会发生这种情况的解释
  • 您认为相关的其他输入

我已经尝试做的诊断或解决问题的方法:

  • 使用其他字符串打印,以查看问题是否源于找不到位置(事实并非如此)
  • 证明行数确实高于计数器达到的行数。
  • 找出重复的数字。

编辑: 根据大众的需求,此表中的两行是这样的(我无法包含实际数据,因为它包含分类信息,因此所有数字均已替换为7,字母已替换为B / b)。

    <row>
        <c1>7777777777</c1>
        <c2>BB</c2>
        <c3>03/20/2013 00:00:00</c3>
        <c4>-1</c4>
        <c5>777777</c5>
        <c6>7</c6>
        <c7>01/01/2013 00:00:00</c7>
        <c8>77777777</c8>
        <c9>7.77</c9>
        <c10>77777-Bbbbbbbb Bbbbb</c10>
        <c11>77-</c11>
        <c12>12615766</c12>
    </row>
    <row>
        <c1>7777777777</c1>
        <c2>BB</c2>
        <c3>03/20/2013 00:00:00</c3>
        <c4>-7</c4>
        <c5>777777</c5>
        <c6>7</c6>
        <c7>07</c7>
        <c8>77777777</c8>
        <c9>7.77</c9>
        <c10>77777-Bbbbbbbb Bbbbb</c10>
        <c11>77-</c11>
        <c12>12615766</c12>
    </row>

第12列是由上述脚本创建的,而下一行则直接位于其下方。问题在于,当递增变量达到12,766时,c12列将使用完全相同的键进行打印。

zjzj5823 回答:Awk递增变量两次计数12,615,766

我将使用一些可以执行流xml解析的xml库。

我将假设c4是您的主键。

我将使用此perl脚本提取所有主键

#!/usr/bin/perl -w
use strict;
use XML::Twig;
my $twig=XML::Twig->new(
  twig_handlers =>
      {  c4  => sub { print $_->text,"\n"; },row  => sub { $_->purge; }
         } ) ;
$twig->parsefile( 'doc.xml');

并将输出重定向到文件all_c4.txt

perl parserow.pl > all_c4.txt

在我进行排序之后,计算uniq行

sort all_c4.txt | uniq -c > all_c4_with_cnt.txt

我将检查不是唯一的行

grep '^ *[2-9] *' all_c4_with_cnt.txt

ps:我使用的perl软件包来自https://metacpan.org/pod/XML::Twig

本文链接:https://www.f2er.com/3169858.html

大家都在问