我有一个大文件,每一行都采用相同的格式(它是类似电子表格的 固定长度纯文本数据文件)。我正在使用 Unix 工具,如grep
,tail
,等。
我想找到包含最少空格数的行。我把它作为粗略的标准来找到文件中最有趣的行,因为空格较少意味着需要检查更多数据。
我想我可以按空格/非空格字符的数量对行进行排序,并得到输出的头部或尾部。像(伪代码):
sort -by (num of spaces asc OR num of non-spaces desc) bigfile.txt
| head -100 > interesting.txt
相反,我也可以使用相同的方法查找空格数最多的行,再次粗略地检查每行中是否有所有必需数据
注意:将整个文件加载到内存中是不可能的。对于某些术语来说, grepping 或者在vim
中逐行浏览文件。此外,有关文件内容的详细信息对于此问题并不重要。
答案 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-
逻辑非常简单:
如果您只想打印行号,请使用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
你喜欢的其他标准。