在大文本文件中搜索并查找位置

时间:2011-12-13 14:00:15

标签: linux ubuntu sed find grep

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

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

我怎么解决?

格尔茨


好的我会举个例子

TEXT
TEXT

TEXT
TEXT
<TAG>TEXT>

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

所以我的条目在文件中看起来像。两者之间可能有任何特征。在$$$$之后,换行符中的下一个netry开始。

现在我的问题了。我想检测entri限制器的3396计数的行号

编辑:

我有解决方案:

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

给我一​​些直到3396个计数的行数。最后一个是我的兴趣点

5 个答案:

答案 0 :(得分:1)

如果没有任何样本数据,很难正确回答,但您可以尝试以下awk one-liner来查看它是否有效。

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

就像早期的海报提到使用更好的语言来支持笨拙古老的awk一样,这里的Perl变体也是 short 。要跳过3395项,并打印第3396项

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

答案 3 :(得分:0)

这可能对你有用(对于这样一个大文件来说它很慢但是速度慢!):

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

答案 4 :(得分:0)

一个更简单的awk命令:

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

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

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