找到一个巨大的ascii文件中包含的最大数字和一组最大数字(用科学计数法)

nam*_*nam 0 unix perl awk

背景:

(1)这是我从大约700Mb的巨大ascii文件中提取的内容:

0, 0, 0, 0, 0, 0, 0, 0, 3.043678e-05, 3.661498e-05, 2.070347e-05,
    2.47175e-05, 1.49877e-05, 3.031176e-05, 2.12128e-05, 2.817522e-05,
    1.802658e-05, 7.192285e-06, 8.467806e-06, 2.047874e-05, 9.621194e-05,
    4.467542e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.000421869,
    5.0003081213, 0.0001938675, 8.70334e-05, 0.0002973858, 0.0003385935,
    8.763598e-05, 2.743326e-05, 0, 0.0001043894, 3.409237e-05, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
Run Code Online (Sandbox Code Playgroud)

(2)我想做两个任务:

(2.1)找到以冒号和分号分隔的数字中的最大值.

它是5.0003081213在上面提取的行中.

(2.2)在行中找出最大的4(表示)值.

它是5.0003081213, 0.000421869, 0.0003385935 and 0.0002973858在上面提取的行中.


我的想法:

(3)我希望能够完成这项工作perl.

(4)我认为我可以匹配数字([0-9.e-]+).


我的问题:

(5)但是,我是新手perl,unix并且我不知道如何继续寻找最大值.

(6)我搜索了半天的类似问题,发现我可以使用List::Util.我不知道这是我的问题的合适选择,实际上我不知道如何采用这个子程序.

(7)说,这些数字包含在一个名为的文件中input.txt.我可以知道是否可以使用单行脚本完成任务?

感谢您的理解,我非常感谢您的帮助.


进一步提问:

感谢许多热烈回复和堆栈溢出用户的帮助,我解决了上述问题.但是,如果我想从以下数据的第3行到第6行找出最大值:

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1.193129938e-07, 0, 0, 0, 0, 0, 0,
    0, 2.505016514e-05, 4.835713883e-05, 6.128770648e-05, 1.38018881e-05, 2.303402101e-05,
    0, 0, 0, 0, 3.5838803e-05, 0.000104883779, 0, 0, 1.813278467e-05, 0.0001350646297,
    0.0007846746908, 0.001728603877, 0.001082733652, 0.001511217708, 0.0009537032505,
    0.0004436753321, 0.002182536356, 0.0005719495782, 9.055173127e-05, 1.245663419e-05,
    0.0004568318755, 0.0003056741688, 3.186642459e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0.000101613512, 5.451410965e-05, 0, 0, 0, 0, 0.001172270099, 7.088900819e-05, 0,
    1.848198352e-06, 0.0006870109246, 0.00276857581, 0.002038545509, 0.001111047938,
    0.0007607533934, 0.0007915864957, 0.001105735631, 0.001456989534, 0.0007245351113,
    0.0004262289031, 0.0003041285247, 0.0001528418892, 2.332078749e-05, 9.695149464e-05,
    1.004024021e-07, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Run Code Online (Sandbox Code Playgroud)

那是,

0, 0, 0, 0, 3.5838803e-05, 0.000104883779, 0, 0, 1.813278467e-05, 0.0001350646297,
    0.0007846746908, 0.001728603877, 0.001082733652, 0.001511217708, 0.0009537032505,
    0.0004436753321, 0.002182536356, 0.0005719495782, 9.055173127e-05, 1.245663419e-05,
    0.0004568318755, 0.0003056741688, 3.186642459e-05, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
Run Code Online (Sandbox Code Playgroud)

那么,我该如何修改脚本 grep -o '[0-9e.-]*' file | sort -rg | head -1来达到这个目的呢?

我知道该命令sed可以通过添加选项在文件行上工作(3,6p).所以,我想知道我是否可以通过添加这样的选项来修改上述脚本.我再次感谢你的帮助.

fed*_*qui 7

我会用的组合grepsort:

grep -o '[0-9e.-]*' file | sort -rg | head -N
Run Code Online (Sandbox Code Playgroud)
  • 该命令grep -o '[0-9e.-]\+'(使用问题中提供的正则表达式)提取文件中的所有数字.
  • 然后,sort -g考虑指数值进行排序; 通过使用-r我们反转结果,使顶部值显示在顶部.
  • 最后,head获得前N个值.

最高价值:

$ grep -o '[0-9e.-]*' file | sort -rg | head -1
5.0003081213
Run Code Online (Sandbox Code Playgroud)

前4名:

$ grep -o '[0-9e.-]*' file | sort -rg | head -4
5.0003081213
0.000421869
0.0003385935
0.0002973858
Run Code Online (Sandbox Code Playgroud)