2010-07-07 2 views
13

Я хотел бы отсортировать файл на других полях. Вкладка образец отделенный файла:unix sorting, с первичными и вторичными ключами

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).

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

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

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

+0

Параметр ' sort', похоже, не поддерживает это. Рассмотрим переход на язык, например, Python или Perl. – Philipp

+0

Да, конечно, это будет мой обходной путь, как я уже упоминал. Я просто хотел знать, можно ли это сделать с чистой сортировкой – zseder

ответ

11

manual показывает несколько примеров.

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

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

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

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

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

Это работает! Спасибо. (С cmd: 'sort -t" "-k1,1d -k3,3g') Однако я не нашел запятую для сортировки в связанном руководстве и обычной странице руководства. Мне нужно больше узнать об этом. И да, я могу сортировать с вкладками. Я могу отнести его к любому другому разделителю, и я могу дать TAB моему терминалу с помощью «ctrl + v; TAB», поэтому это не проблема, я просто хотел пояснить, что это не то, что я делаю неправильно. В любом случае, спасибо! – zseder

+1

Вы также можете создать вкладку, не используя 'echo' или ctrl + v:' TAB = $ '\ t''. @zseder: в этом контексте запятая является оператором диапазона. Аргумент '-k1,1d' означает« создать ключ, начиная с первого и заканчивая в первом столбце в словаре ». –

+0

И как получилось, что -k1d не равно -k1,1d? Мое намерение состоит в том, что они должны быть одинаковыми ... – zseder

-3

Вот скрипт 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() 
Смежные вопросы