我有非常大的数据要排序
所以,我的最终输出应该是这样的:
1 11
1 13
1 15
2 3
2 5
chr2 6
chr2 15
chr15 3
chr15 9我在unix上使用的是sort。但是,我要么将chr2放在顶部,要么放在底部,尝试任何一种方式。以下是我尝试过的一些类型:它们不能给我所需的输出:
sort -V -k1,1n -k2n final_merged.txt > merged-sort.txt
sort -k1,1n -k2n final_merged.txt > merged-sort.txt
sort -k1,1h -k2n final_merged.txt > merged-sort.txt
sort -k1,1 -k2n final_merged.txt > merged-sort.txt后期编辑:解决此问题的任何方法,而不会在使用时超载内存
unix utilities
谢谢,
发布于 2018-06-01 09:11:35
尝试:
sort -k1,2 -V final_merged.txt使用您的样例数据运行此程序会得到以下结果:
1 11
1 13
1 15
2 3
2 5
chr2 6
chr2 15
chr15 3
chr15 9发布于 2018-06-01 08:28:38
您想要数字排序,但'chr2‘不是数字。您需要一个预处理步骤,将第一列拆分为两列,文本部分和数字部分。
gawk 'match($1, /([^0-9])*([0-9]*)/, a) {print a[1], a[2], $2}' /tmp/abc | sort -t ' ' -k1,1 -k2,2n -k3,3n
使用gawk在正则表达式上拆分,先是非数字,然后是数字,然后是第二列(现在由单个空格分隔)。
对单个空格分隔的列进行排序。
gawk '{print $1 $2, $3}'以重新组合列。
您可能需要修改这些内容,以保留所需的空格。
发布于 2018-06-01 09:20:03
Python解决方案:
初始化Natural Sort。
import re
_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
return [int(text) if text.isdigit() else text.lower()
for text in re.split(_nsre, s)]然后按您想要的方式排序:
sorted_data = sorted(data, key=lambda item: (natural_sort_key(str(item[0])), item[1]))首先使用natural sort对item[0]进行排序,然后对item[1]进行数值排序。
https://stackoverflow.com/questions/50634189
复制相似问题