gpt4 book ai didi

linux - awk 递增变量计数 12,615,766 两次

转载 作者:太空宇宙 更新时间:2023-11-04 09:57:54 26 4
gpt4 key购买 nike

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

每行有 14 行,由 12 列和 2 行开始和结束标记组成。

现在,这 12 列中的一行是主键,它本质上是一个从 1 开始到 50,446,817 结束的计数器...或者至少应该。相反,它以 50,446,816 结束,验证软件说有 1 个主键不是唯一的。

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

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

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

我知道脚本本身对于整个子字符串有点毫无意义,我没有 awk 技能,只是真正从另一个脚本中回收它。

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

非常感谢以下类型的输入:

  • 实现此 awk 脚本的目的的另一种方法(制作主键列)
  • 解释为什么会发生这种情况
  • 您认为相关的任何其他输入

我已尝试诊断或解决问题:

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

编辑:应大家的要求,这张表中的两行是这样的(我不能包括实际数据,因为它包含 secret 信息,所以所有数字都被替换为 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,615,766 时,c12 列使用完全相同的键打印。

最佳答案

我将使用一些可以进行流式 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

在我排序之后,计算唯一行数

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

关于linux - awk 递增变量计数 12,615,766 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58685313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com