【问题标题】:search and find position in large txt file在大 txt 文件中搜索和查找位置
【发布时间】:2012-01-19 09:33:26
【问题描述】:

我想在 linux dist 的一个大 txt 文件 (187GB) 中找到一个位置。

txt 文件中的每个条目都受 $$$$ 限制,我想在文件中找到 3396 条目。所以我需要数一下 $$$$,然后当它达到 3396 时。

我该如何解决?

问候


好的,我举个例子

TEXT
TEXT

TEXT
TEXT
<TAG>TEXT>

<TAG>
TEXT
TEXT
</TEXT>
$$$$

所以我的条目看起来像在文件中。之间可以有任何字符。 $$$$ 之后,换行中的下一个网络开始。

现在我的问题又来了。我想检测entri的limiter的3396-count的行号

编辑:

我有办法:

grep -m 3396 -n '$$$$' FILE

给我行号直到 3396 计数 $$$$。最后一个是我的兴趣线

【问题讨论】:

  • 文件的格式是怎样的?文件中是否有换行符?您感兴趣的 entry 会跨越多行吗?分隔符可以出现在任何地方还是只出现在行首?

标签: linux ubuntu sed find grep


【解决方案1】:

我认为最好使用 python(或其他语言)。

看看http://docs.python.org/library/re.html#re.finditer

美元符号之间的文本是否有固定长度?如果是,您可以使用 seek() 快速跳转到正确的部分。

【讨论】:

    【解决方案2】:

    没有任何样本数据很难正确回答,但你可以试试下面的awk one-liner看看是否有效。

    awk '{for(i=1;i<=NF;i++) {if ($i=="$$$$") count++; if ($i=="$$$$" && count==3396) print $(i+1);}}' INPUT_FILE
    

    【讨论】:

      【解决方案3】:

      正如之前提到的使用更好的语言来支持笨拙的古老 awk 的海报一样,这里有一个 Perl 变体,它也是 short。跳过 3395 项,并打印第 3396 次使用

      perl -e '$/=q/$$$$/;<>while$.<3395;print$_=<>' <foo.txt
      

      【讨论】:

        【解决方案4】:

        这可能对你有用(它是 sed,但是对于这么大的文件来说会变慢!):

        for x in {1..4000} ; do echo -e '$$$$\n'$x ; done |
        sed -n '/$$$$/{x;s/^/x/;ta;:a;s/x/&/3396;tb;x;b;:b;x;p;:c;n;p;/$$$$/!bc;q}'       
        $$$$
        3396
        $$$$
        

        【讨论】:

          【解决方案5】:

          一个更简单的awk 命令:

          awk '/\$\$\$\$/ { if (++count == 3396) { print; exit } }'
          

          如果您想对多个文件执行此操作,可以将 exit 更改为 newfile

          假设您要打印包含$$$$ 的第3396 行;否则,你找到后想做什么?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-15
            • 1970-01-01
            • 1970-01-01
            • 2012-10-06
            • 1970-01-01
            • 2018-10-26
            • 2017-04-13
            • 1970-01-01
            相关资源
            最近更新 更多