1

说,如果我有一个包含内容的文件:

a1dc3
ab2
ab4c
b3a
ca15d2
...

每行至少有一个整数。我想要做的是根据每行的第一个整数对这些行进行排序。

我的想法是我们可以很容易地从每一行中获取第一个整数。然后使用命令sort -g对数字序列进行排序。如果我知道描述sort命令如何对数字序列进行排序的排序矩阵,我可以解决这个问题。

总之,我需要一个命令行实用程序qsort,例如 C 程序中的命令行实用程序。一旦我给出了qsort一个函数compare,那么序列就可以按照我想要的方式排序。

明白了吗?有人有什么想法吗?

4

3 回答 3

4

提取数字,将其添加为前缀,排序,丢弃前缀。

sed 's/\([^0-9]*\)\([1-9][0-9]*\)/\2 \1\2/' |
sort -n |
cut -d ' ' -f2-

这假设您希望对每行的第一个数字序列进行升序数字排序,并且所有行都至少包含一个数字。

另见http://en.wikipedia.org/wiki/Schwartzian_transform

于 2013-08-31T08:51:29.570 回答
3

试试这个 awk-sort-awk 管道:

$ awk -F '[^0-9]*' '{print ($1!=""?$1:$2), $0}' file | sort -n | awk '{$1=""}1'
 a1dc3
 ab2
 b3a
 ab4c
 ca15d2
于 2013-08-31T08:50:13.677 回答
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)
于 2013-08-31T09:25:32.777 回答