使用Unix工具查找空格数最少的行

时间:2013-12-22 07:37:12

标签: file sorting unix awk grep

我有一个大文件,每一行都采用相同的格式(它是类似电子表格的 固定长度纯文本数据文件)。我正在使用 Unix 工具,如greptail

我想找到包含最少空格数的行。我把它作为粗略的标准来找到文件中最有趣的行,因为空格较少意味着需要检查更多数据。

我想我可以按空格/非空格字符的数量对行进行排序,并得到输出的头部或尾部。像(伪代码):

sort -by (num of spaces asc OR num of non-spaces desc) bigfile.txt
    | head -100 > interesting.txt

相反,我也可以使用相同的方法查找空格数最多的行,再次粗略地检查每行中是否有所有必需数据

注意:将整个文件加载到内存中是不可能的。对于某些术语来说, grepping 或者在vim中逐行浏览文件。此外,有关文件内容的详细信息对于此问题并不重要。

4 个答案:

答案 0 :(得分:2)

您可以使用perl执行此操作,例如:

perl -ne 'print tr/ //, ":$_"' bigfile.txt

tr/ //将计算行中的空格数。您可以将其输入| sort -n | head -n 100以找到“最有趣”的行。

您可能想要排除空行:

perl -ne 'print tr/ //, ":$_" if length > 1' bigfile.txt

如果您知道您对超过N=10个空格的行不感兴趣,那么您可以通过添加对此阈值的检查来加快处理速度:

perl -ne '$s = tr/ //; print "$s:$_" if length > 1 && $s < 10' bigfile.txt

这将有助于sort,因为它不需要扫描整个输出。事实上,如果没有阈值,排序将不可避免地意味着将整个文件加载到内存中。

答案 1 :(得分:2)

尝试此命令:

gawk -vOFS='\t' '{print length(gensub(/ /, "", "g")), $0}' bigfile.txt |
 sort -k1,1nr |
  head -100 |
   cut -f2-

逻辑非常简单:

  • prepend non-whitespace-chars count
  • 按计数desc进行数字排序
  • 获得前100行
  • 删除前置号码

如果您只想打印行号,请使用NR代替$0,并且会减少使用内存。

答案 2 :(得分:1)

使用awk计算空格。

awk -F" " 'NR==1 {m=l=gsub(/ /,x);m1=l1=1;next} {s=gsub(/ /,x);if (s>m) {m=s;m1=NR};if (s<l) {l=s;l1=NR}} END {print "line="l1" has least spaces\nline="m1" has most spaces"}' file

答案 3 :(得分:0)

这将打印所有空白字符数最少的行:

awk -F'[ ]' 'NR==FNR{min=(NF<min?NF:min); next} NF==min' file file

这就是你要找的全部吗?显然你可以调整它来打印少于两分钟的行:

awk -F'[ ]' 'NR==FNR{min=(NF<min?NF:min); next} NF<=(2*min)' file file

你喜欢的其他标准。