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

标签 linux bash unix awk cygwin

我有一个巨大的 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/

相关文章:

linux - 如何将此 linux 汇编代码更改为兼容的 UNIX 汇编代码?

linux - 用变量个性化 mutt 的主题

bash - 循环遍历以空格分隔的字符串的简单 Unix 方式?

unix - 语法突出显示/着色猫

Linux 命令行工具 : df and du

linux - 使 sh 像窗口中的 exe 一样可执行

bash - 如何在 bash 命令中转义双引号

c++ - 从 C++ 应用程序将源命令传递给 bash 时出现问题

linux - Unix/Linux 命令有返回值吗?

linux - 仅在找到文件时创建 ZIP - 使用 shell 脚本