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

标签 linux command-line sorting

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

我有文件,为了论证,假设我有这些文件:(我的文件是一样的我只是有更多)

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

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

如果我在 linux 命令行中键入 ls,我会得到以下垃圾信息。请注意 20 被置换了。当我有数百个这样的文件要在报告中按顺序查看时,这就更重要了。

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

我可以使用 ls -1 | sort -n -k 1.6 得到没有 'k' 或 'M' 的正确...

  • 文件-k100.xml
  • 文件-k10.xml
  • 文件-k20.xml
  • 文件-M100.xml
  • 文件-M10.xml
  • 文件-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
  • 文件-k10.xml
  • 文件-M10.xml
  • 文件-k20.xml
  • 文件-M20.xml
  • 文件-k100.xml
  • 文件-M100.xml

好的,好的。让我们真的做对了。 ls -1 | grep "文件-[0-9]*\.xml"|排序-n -k1.6 && ls -1 文件-k*.xml |排序-n -k1.7 && ls -1 文件-M*.xml |排序-n -k1.7

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

哇!男孩很高兴“linux 命令行的力量”救了我。 (这对我的情况不实用,因为我有一个命令,而不是 ls -1 是另一行或两行)

现在,Windows 的行为简单、优雅,并且在 99% 的时间里都能按照您的意愿去做。为什么我不能在 linux 中使用它?为什么哦,为什么 sort 没有“以一种不会让我撞墙的方式自动排序数字”开关?

这是 C++ 的伪代码:

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;
}

有这么难吗?有人可以整理一下并发给我一份吗?请问?

最佳答案

尝试 排序 --version-sort -f

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

-f 选项是忽略大小写(否则,在本例中,k 和 M 的顺序会错误)。但是,我不认为 sort 没有正确地将字母 k 和 M 解释为成千上万,如果那是您的目标 - 它只是按字母顺序排列。

关于linux - 如何从 linux 命令行按数字对文件进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323619/

相关文章:

java - 是否有广泛使用的 Java NavigableMap 接口(interface)的 C++ 版本?

c - 在linux系统上顺序打开和读取多个文件

java编译命令行

linux - Bash:无效的命令

java - 不需要命令行参数的程序是否需要 String args[] 参数?

linux - 一种解析终端输出/输入的方法? (.bashrc?)

java - 无法调用 Collections.sort(arrayList)

c++ - 寻找更好的数据排序方法

linux - Amazon EC2 无法通过 Ubuntu 连接 SSH

linux - Bash 简化数独