Подтвердить что ты не робот

Unix, с первичными и вторичными ключами

Я хотел бы отсортировать файл в других полях. Файл с разделяемой вкладкой:

a   1   1.0
b   2   0.1
c   3   0.3
a   4   0.001
c   5   0.5
a   6   0.01
b   7   0.01
a   8   0.35
b   9   2.3
c   10  0.1
c   11  1.0
b   12  3.1
a   13  2.1

И я бы хотел, чтобы он отсортировался в алфавитном порядке по полю 1 (с -d), а когда поле1 одинаково, сортируйте по полю 3 (с опцией -g).

A не удалось это сделать. Мои attemps были (с реальным символом TAB вместо <TAB>):

cat tst | sort -t"<TAB>" -k1 -k3n
cat tst | sort -t"<TAB>" -k1d -k3n
cat tst | sort -t"<TAB>" -k3n -k1d

Ни один из них не работает. Я не уверен, что сортировка даже способна сделать это. Я напишу script для обходного пути, поэтому мне просто интересно, есть ли решение, использующее только sort.

4b9b3361

Ответ 1

В руководстве приведены некоторые примеры.

В соответствии с комментарием zseder это работает:

sort -t"<TAB>" -k1,1d -k3,3g

Таб должен теоретически работать так же, как это sort -t"\t".

Если ни одно из вышеперечисленных действий не ограничивает вкладку, это уродливое обходное решение:

TAB=`echo -e "\t"`
sort -t"$TAB"

Ответ 2

Вот Python script, который вы можете использовать в качестве отправной точки:

#!/usr/bin/env python2.6

import sys
import string

def main():
    fname = sys.argv[1]
    data = []
    with open(fname, "rt") as stream:
        for line in stream:
            line = line.strip()
            a, b, c = line.split()
            data.append((a, int(b), float(c)))
    data.sort(key=my_key)
    print data


def my_key(item):
    a, b, c = item
    return c, lexicographical_key(a)


def lexicographical_key(a):
    # poor man attempt, should use Unicode classification etc.
    return a.translate(None, string.punctuation)


if __name__ == "__main__":
    main()