首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一列上先按数字排序,然后按字母数字排序

在同一列上先按数字排序,然后按字母数字排序
EN

Stack Overflow用户
提问于 2018-06-01 07:31:01
回答 3查看 58关注 0票数 0

我有非常大的数据要排序

  • 第1列:按数字排序,然后在第2列:按数字排序。

所以,我的最终输出应该是这样的:

代码语言:javascript
复制
1    11  
1    13
1    15
2    3
2    5
chr2   6
chr2   15
chr15   3
chr15   9

我在unix上使用的是sort。但是,我要么将chr2放在顶部,要么放在底部,尝试任何一种方式。以下是我尝试过的一些类型:它们不能给我所需的输出:

代码语言:javascript
复制
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

  • python sort或other

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-01 09:11:35

尝试:

代码语言:javascript
复制
sort -k1,2 -V final_merged.txt

使用您的样例数据运行此程序会得到以下结果:

代码语言:javascript
复制
1    11
1    13
1    15
2    3
2    5
chr2   6
chr2   15
chr15   3
chr15   9
票数 2
EN

Stack Overflow用户

发布于 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}'以重新组合列。

您可能需要修改这些内容,以保留所需的空格。

票数 0
EN

Stack Overflow用户

发布于 2018-06-01 09:20:03

Python解决方案:

初始化Natural Sort

代码语言:javascript
复制
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)]

然后按您想要的方式排序:

代码语言:javascript
复制
sorted_data = sorted(data, key=lambda item: (natural_sort_key(str(item[0])), item[1]))

首先使用natural sortitem[0]进行排序,然后对item[1]进行数值排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50634189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档