背景:
(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).所以,我想知道我是否可以通过添加这样的选项来修改上述脚本.我再次感谢你的帮助.
我会用的组合grep和sort:
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)