Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 使用Unix工具查找空格数最少的行_File_Sorting_Unix_Awk_Grep - Fatal编程技术网

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

File 使用Unix工具查找空格数最少的行,file,sorting,unix,awk,grep,File,Sorting,Unix,Awk,Grep,我有一个大文件,每一行的格式都相同,它是一个类似电子表格的固定长度纯文本数据文件。我正在使用诸如grep、tail等Unix工具 我想找到包含最少空格的行。我把它作为在文件中找到最有趣的行的粗略标准,因为空间越小,需要检查的数据就越多 我想我可以按照空格/非空格字符的数量对行进行排序,并得到输出的开头或结尾。类似于伪代码: 相反,我也可以使用相同的方法来查找空格最多的行,再次粗略地检查每行中是否有所有必需的数据 注意:不可能将整个文件加载到内存中。在vim中,对某些术语进行grepping或逐行

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

我想找到包含最少空格的行。我把它作为在文件中找到最有趣的行的粗略标准,因为空间越小,需要检查的数据就越多

我想我可以按照空格/非空格字符的数量对行进行排序,并得到输出的开头或结尾。类似于伪代码:

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


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

您可以使用perl来实现这一点,例如:

perl -ne 'print tr/ //, ":$_"' bigfile.txt
tr///将计算行中的空格数。你可以通过管道将其输入| sort-n | head-n100,以找到最有趣的线条

您可能希望排除空行:

perl -ne 'print tr/ //, ":$_" if length > 1' bigfile.txt
如果您知道您对超过N=10个空格的行不感兴趣,则可以通过添加对该阈值的检查来加快该过程:

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

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

您可以使用perl实现这一点,例如:

perl -ne 'print tr/ //, ":$_"' bigfile.txt
tr///将计算行中的空格数。你可以通过管道将其输入| sort-n | head-n100,以找到最有趣的线条

您可能希望排除空行:

perl -ne 'print tr/ //, ":$_" if length > 1' bigfile.txt
如果您知道您对超过N=10个空格的行不感兴趣,则可以通过添加对该阈值的检查来加快该过程:

perl -ne '$s = tr/ //; print "$s:$_" if length > 1 && $s < 10' bigfile.txt
这将有助于排序,因为它不需要扫描整个输出。事实上,如果没有阈值,排序将不可避免地意味着将整个文件加载到内存中。

尝试以下命令:

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

前置非空白字符计数 数字按计数排序说明 获取前100行 删除带前缀的数字 如果您只想打印行号,请使用NR而不是$0,这样会占用更少的内存。

尝试以下命令:

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

前置非空白字符计数 数字按计数排序说明 获取前100行 删除带前缀的数字 如果您只想打印行号,请使用NR而不是$0,这样会占用更少的内存。

使用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
使用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

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

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

您喜欢的任何其他条件。

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

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

不管你喜欢什么标准。

谢谢你的最后一条建议,当然也谢谢你的回答。我有点意识到排序需要时间加载到内存中,但我成功地处理了一个3GB的文件,没有问题,也没有太多等待。但我想我可以通过抓取一些随机线来估计可能的阈值,即使我不确定。再次感谢!无论如何,内存注释更多的是针对GUI工具,如Windows中的记事本+。。即使我有12GB的内存,这也会让电脑死机!如果GNU排序不能将整个文件放入核心,它会使用临时文件返回到合并排序。这使得它更慢,但它应该处理非常大的文件,直到$TMPDIR分区上的可用空间;有关如何临时覆盖临时文件位置的信息,请参阅手册页。感谢您的最后提示,当然也感谢您的回答。我有点意识到排序需要时间加载到内存中,但我成功地处理了一个3GB的文件,没有问题,也没有太多等待。但我想我可以通过抓取一些随机线来估计可能的阈值,即使我不确定。再次感谢!无论如何,内存注释更多的是针对GUI工具,如Windows中的记事本+。。即使我有12GB的内存,这也会让电脑死机!如果GNU排序不能将整个文件放入核心,它会使用临时文件返回到合并排序。这使得它更慢,但它应该处理非常大的文件,直到$TMPDIR分区上的可用空间;有关如何临时替代临时文件位置的信息,请参见手册页。