说,如果我有一个包含内容的文件:
a1dc3
ab2
ab4c
b3a
ca15d2
...
每行至少有一个整数。我想要做的是根据每行的第一个整数对这些行进行排序。
我的想法是我们可以轻松地从每一行获得第一个整数。然后使用命令sort -g
对数字序列进行排序。我可以解决问题如果我知道排序矩阵,它描述了sort
命令如何对数字序列进行排序。
总之,我需要一个命令行实用程序qsort
,就像C程序中的一样。一旦我给qsort
一个函数compare
,那么序列可以按我想要的顺序排序。
这是清楚的吗?任何人有任何想法?
答案 0 :(得分:4)
提取号码,将其添加为前缀,排序,丢弃前缀。
sed 's/\([^0-9]*\)\([1-9][0-9]*\)/\2 \1\2/' |
sort -n |
cut -d ' ' -f2-
这假设您希望在每行的第一个数字序列上进行升序数字排序,并且所有行都包含至少一个数字。
答案 1 :(得分:3)
试试这个awk-sort-awk管道:
$ awk -F '[^0-9]*' '{print ($1!=""?$1:$2), $0}' file | sort -n | awk '{$1=""}1'
a1dc3
ab2
b3a
ab4c
ca15d2
答案 2 :(得分:3)
在C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
static int intpart(const char *s)
{
while (*s) {
if (isdigit((unsigned char)*s)) break;
s++;
}
return atoi(s);
}
static int comp(const void *pa, const void *pb)
{
int a = intpart(*(const char **)pa);
int b = intpart(*(const char **)pb);
return (a < b) ? -1 : (a > b);
}
int main(int argc, char *argv[])
{
int i;
if (argc < 2) {
fprintf(stderr, "Usage: %s args\n", argv[0]);
exit(EXIT_FAILURE);
}
qsort(&argv[1], argc - 1, sizeof(char *), comp);
for (i = 1; i < argc; i++) {
printf("%s\n", argv[i]);
}
return 0;
}
使用以下方式运行:
./mysort a1dc3 ab2 ab4c b3a ca15d2
或
./mysort $(< file)