![强制 GNU Sort 命令仅考虑前 N 个小数点](https://linux22.com/image/130816/%E5%BC%BA%E5%88%B6%20GNU%20Sort%20%E5%91%BD%E4%BB%A4%E4%BB%85%E8%80%83%E8%99%91%E5%89%8D%20N%20%E4%B8%AA%E5%B0%8F%E6%95%B0%E7%82%B9.png)
example
请考虑一个名为包含以下数据的文本文件:
0 0.2667328325084663 0.02243994752564071
0 1.86630577374265 0.02243994752564048
0 0.2401209140718633 0.02243994752564071
我们example
通过以下命令首先对第三列进行排序,然后对第二列进行排序:
sort -g -k 3,3 -k 2,2 <example > sortedExample
新文件sortedExample
现在包含以下内容:
0 1.86630577374265 0.02243994752564048
0 0.2401209140718633 0.02243994752564071
0 0.2667328325084663 0.02243994752564071
从第2列可以看出,其第一行的数据值高于第二行的数据值。这是预期的,因为第三列的第一行0.02243994752564048
小于第二列的第一行0.02243994752564071
。
问题是0.02243994752564048
和0.02243994752564071
在十进制第 15 位以内都是相同的,因此我们可以假设它们在广泛的应用中具有相同的值。
有没有什么方法可以告诉sort
我们只考虑第一个N
小数点,例如此处的 15?
答案1
@steeldriver 给出了更有说服力的答案(假设我们使用GNU version of sort
并希望考虑前 6 个小数点):
sort -g -k 3.1,3.6 -k 2.1,2.6 <example > sortedExample
导致:
0 0.2401209140718633 0.02243994752564071
0 0.2667328325084663 0.02243994752564071
0 1.86630577374265 0.02243994752564048
基于这个答案:
首先,我们用以下内容截断(例如到小数点后第六位)第二列和第三列(目前每列应用两次,我将随着时间的推移编辑我的答案):
sed 's|\([0-9]\.[0-9]\{6\}\)[0-9]\{1,\}|\1|' example > interim
然后,上述命令:
sort -g -k 3,3 -k 2,2 <interim2 > sortedExample
获得期望的结果为:
0 0.240120 0.022439
0 0.266732 0.022439
0 1.866305 0.022439