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.
Ответы
Ответ 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()