1

内容を含むファイルがある場合、次のようにします。

a1dc3
ab2
ab4c
b3a
ca15d2
...

各行に少なくとも 1 つの整数があります。私がやりたいことは、各行の最初の整数に従ってこれらの行をソートすることです。

私の考えは、各行から最初の整数を簡単に取得できるということです。次に、コマンドsort -gを使用して数値シーケンスをソートします。sortコマンドが数値シーケンスをソートする方法を説明するソート行列を知っていれば、問題を解決できます。

qsort結論として、 C プログラムのようなコマンド ライン ユーティリティが必要です。qsorta functionをcompare指定すると、シーケンスを必要に応じて並べ替えることができます。

それは明らかですか?誰でも何か考えがありますか?

4

3 に答える 3

4

番号を抽出し、プレフィックスとして追加し、並べ替え、プレフィックスを破棄します。

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

これは、各行の最初の数字シーケンスで数値の昇順ソートが必要であり、すべての行に少なくとも 1 つの数字が含まれていることを前提としています。

http://en.wikipedia.org/wiki/Schwartzian_transformも参照してください。

于 2013-08-31T08:51:29.570 に答える
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 に答える
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 に答える