2011-12-13 64 views
1

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

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

我怎么能解决?

格尔茨


好,我举一个例子

TEXT 
TEXT 

TEXT 
TEXT 
<TAG>TEXT> 

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

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

现在我的问题再次。我要检测的entri的限制器的3396计数的行数

编辑:

我有解决方案:

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

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

+0

该文件的格式是什么样的?文件中是否有换行符?您感兴趣的*条目是否跨越多行?分隔符是否可以在任何地方出现,或者只在一行的开头? –

回答

1

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

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

正如提到赞成笨拙古AWK的使用更好的语言较早的海报,这里是一个Perl的变种,也。要跳过3395项,并打印第三千三百九十六使用

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

这可能会为你工作(这是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 
$$$$ 
0

一个稍微简单awk命令:

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

,如果你想这样做将多个文件你可以改变exitnewfile

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

相关问题