使用shell脚本计算非常大的文件(~50 GB)的分隔符

时间:2016-03-17 16:32:02

标签: shell awk

我有一个文件' test.txt'其中包含超过2,000,000,000条记录。

每条记录都在一个单独的行上,并且多个字段由分隔符|分隔。

每一行应具有相同数量的字段,但问题是可能存在行具有更少或更多分隔符的情况

有人可以在Unix中为更大的文件建议一种最有效的方法,通过它我可以识别该行。 (比如在文件的每一行中计算|个字符,如果|少于或多,则抛出错误)

我试过

awk -F '|'  'NF != 35 {print NR, $0} ' test.txt

但按下输入时我从1到2获得数字(在第二个第三个输入按钮之后)然后是3个(在第三个输入按钮之后)

2 个答案:

答案 0 :(得分:1)

这不能回答您的问题,但awk的行为不应视文件大小而异,您发布的命令不应提示您按Enter键。你确定不存在一些(控制台)缓冲,并且命令会在没有任何输入的情况下完成所有相同的操作吗?

您可以尝试这样做,这会为awk的{​​{1}}提供尽可能多的新内容:

STDIN

至于效率,除了正确的功能之外,实际上没有任何方法可以比查看每一行更有效地执行所需的操作(运行时 O(n)其中 n 是行数。)

答案 1 :(得分:1)

这应该可以解决问题:

awk 'BEGIN { FS="|";}{ if (NF != 36) print $0}' yourFile.txt

说明: BEGIN用于在主模式匹配完成之前在awk脚本中进行预处理。在这里,我将分隔符设置为匹配|而不是默认的空格

NF是awk使用的内部变量,用于确定记录的一行中存在多少个字段。您想检查一行是否包含多于或少于35个分隔符。

这相当于说一个给定行中是否有多于或少于36个字段。

请参阅此link以获取有关awk脚本的详细介绍