首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从linux命令行对文件进行数字排序

如何从linux命令行对文件进行数字排序
EN

Stack Overflow用户
提问于 2010-07-24 02:56:59
回答 3查看 22.8K关注 0票数 16

好吧,这与其说是一个问题,不如说是对Linux的咆哮,但也许有人知道如何做我想做的事情。我知道可以使用sort命令来实现这一点,但是我想要一个更好的解决方案,因为要做到这一点就像编写一个C程序来做同样的事情一样容易。

我有文件,为了论据,让我们说我有这些文件:(我的文件是一样的,我只是有更多的)

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

现在这就是我要他们排序的顺序。顺便说一句,这是Windows中默认排序的顺序。那很好。Windows将连续的数字字符分组为一个有效字符,该字符按字母之前的字母顺序排序。

如果我在linux命令行输入ls,就会得到以下垃圾。注意,20被移开了。这是一个更大的交易,当我有数以百计的这些文件,我想在一个报告中查看,以便。

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml

我可以用ls -1 | sort -n -k 1.6得到没有“k”或“M”的.

  • file-k100.xml
  • file-k10.xml
  • file-k20.xml
  • file-M100.xml
  • file-M10.xml
  • file-M20.xml
  • file-10.xml
  • file-20.xml
  • file-100.xml

我可以用ls -1 | sort -n -k 1.7让所有这些都不正确

  • file-100.xml
  • file-10.xml
  • file-20.xml
  • file-k10.xml
  • file-M10.xml
  • file-k20.xml
  • file-M20.xml
  • file-k100.xml
  • file-M100.xml

好吧,好吧。让我们把它做好。ls -1 | grep "file-[0-9]*\.xml" | sort -n -k1.6 && ls -1 file-k*.xml | sort -n -k1.7 && ls -1 file-M*.xml | sort -n -k1.7

  • file-10.xml
  • file-20.xml
  • file-100.xml
  • file-k10.xml
  • file-k20.xml
  • file-k100.xml
  • file-M10.xml
  • file-M20.xml
  • file-M100.xml

呼!男孩很高兴“linux命令行的强大”拯救了我。(对于我的情况来说,这是不实用的,因为我有一个命令,而不是ls -1,而是另一行或两行长)

现在,Windows的行为是简单的、优雅的,并且在99%的时间里做您希望它做的事情。为什么我不能在linux中拥有这种功能呢?为什么sort没有一个“自动排序号码,以不让我撞墙”开关?

下面是C++的伪代码:

代码语言:javascript
复制
bool compare_two_strings_to_avoid_head_injury(string a, string b)
{
    string::iterator ai = a.begin();
    string::iterator bi = b.begin();
    for(; ai != a.end() && bi != b.end(); ai++, bi++)
    {
        if (*ai is numerical)
            gobble up the number incrementing ai past numerical chars;
        if (*bi is numerical)
            gobble up the number incrementing bi past numerical chars;
        actually compare *ai and *bi and/or the gobbled up number(s) here
            to determine if we need to compare more chars or can return the 
            answer now;
    }
    return something here;
}

有那么难吗?有人能把这个整理一下然后寄给我一份吗?请?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-24 04:09:17

这将是我的第一个想法:

代码语言:javascript
复制
ls -1 | sed 's/\-\([kM]\)\?\([0-9]\{2\}\)\./-\10\2./' | sort | sed 's/0\([0-9]\{2\}\)/\1/'

基本上,我只使用sed,用零来填充数字,然后再用它去掉前导零点。

我不知道在Perl中是否会更快。

票数 2
EN

Stack Overflow用户

发布于 2012-06-28 00:41:39

尝试排序--版本排序-f

  • file-k20.xml

  • file-k100.xml

  • file-M10.xml

  • file-M20.xml

  • file-M100.xml

  • 文件-10.xml
  • 文件-20.xml
  • 文件-100.xml
  • 文件-k10.xml

-f选项是忽略大小写(否则,它将使k和M在本例中处于错误的顺序)。然而,我认为排序不能正确地将字母k和m解释为成千上万,如果这是你的目标--这只是字母顺序。

票数 37
EN

Stack Overflow用户

发布于 2010-07-24 03:34:53

ls -1v会把你拉得很近。它只是在小写之前对大写字母进行排序。

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

https://stackoverflow.com/questions/3323619

复制
相关文章

相似问题

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