好吧,现在这与其说是一个问题,不如说是对 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/