好吧,这与其说是一个问题,不如说是对Linux的咆哮,但也许有人知道如何做我想做的事情。我知道可以使用sort命令来实现这一点,但是我想要一个更好的解决方案,因为要做到这一点就像编写一个C程序来做同样的事情一样容易。
我有文件,为了论据,让我们说我有这些文件:(我的文件是一样的,我只是有更多的)
现在这就是我要他们排序的顺序。顺便说一句,这是Windows中默认排序的顺序。那很好。Windows将连续的数字字符分组为一个有效字符,该字符按字母之前的字母顺序排序。
如果我在linux命令行输入ls,就会得到以下垃圾。注意,20被移开了。这是一个更大的交易,当我有数以百计的这些文件,我想在一个报告中查看,以便。
我可以用ls -1 | sort -n -k 1.6得到没有“k”或“M”的.
我可以用ls -1 | sort -n -k 1.7让所有这些都不正确
好吧,好吧。让我们把它做好。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
呼!男孩很高兴“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;
}有那么难吗?有人能把这个整理一下然后寄给我一份吗?请?
发布于 2010-07-24 04:09:17
这将是我的第一个想法:
ls -1 | sed 's/\-\([kM]\)\?\([0-9]\{2\}\)\./-\10\2./' | sort | sed 's/0\([0-9]\{2\}\)/\1/'基本上,我只使用sed,用零来填充数字,然后再用它去掉前导零点。
我不知道在Perl中是否会更快。
发布于 2012-06-28 00:41:39
尝试排序--版本排序-f
-f选项是忽略大小写(否则,它将使k和M在本例中处于错误的顺序)。然而,我认为排序不能正确地将字母k和m解释为成千上万,如果这是你的目标--这只是字母顺序。
发布于 2010-07-24 03:34:53
ls -1v会把你拉得很近。它只是在小写之前对大写字母进行排序。
https://stackoverflow.com/questions/3323619
复制相似问题