сортировка 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), и когда field1 является тем же, видом полем 3 (с -g опция).

Не преуспевает в том, чтобы делать это. Мои attemps были (с реальным Символом табуляции вместо <TAB>):

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

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

15
задан Cristian Ciupitu 16 July 2014 в 18:44
поделиться

2 ответа

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

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

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

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

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

TAB=`echo -e "\t"`
sort -t"$TAB"
13
ответ дан 1 December 2019 в 05:02
поделиться

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

#!/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's attempt, should use Unicode classification etc.
    return a.translate(None, string.punctuation)


if __name__ == "__main__":
    main()
-4
ответ дан 1 December 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: