2015-07-20 2 views
0

У меня есть очень большой файл (много гигабайт), который выглядит какКак совместить сортировку по возрастанию и убыванию?

input.txt

a|textA|2 
c|textB|4 
b|textC|5 
e|textD|1 
d|textE|4 
b|textF|5 

На первом этапе, я хочу, чтобы отсортировать строки численно третьего столбца в порядке убывания, и если строки имеют одинаковое значение третьего столбца, они должны быть отсортированы по тексту первого столбца - в порядке возрастания. И если строки имеют равные значения для их 1-го и 3-го столбцов, они должны быть отсортированы по 2-м столбцу в порядке возрастания. Вторая колонка гарантированно будет уникальной и различной.

Итак, я хочу, чтобы результат:

desiredOutput.txt

b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 

я могу сделать первый шаг:

sort -t\| -bfrnk3 path/to/input.txt > path/to/output.txt 

Но что дальше? И, может быть, результат может быть достигнут за один проход?

EDIT
Я проверил sort -t '|' -k 3,3nr -k 1,1 -k 2,2 input.txt > output.txt. Он дает следующий «output.txt»:

b|textF|5 
b|textC|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 

, который не является тем, что я хочу.

ответ

2
$ cat file 
a|textA|2 
c|textB|4 
b|textC|5 
e|textD|1 
d|textE|4 
b|textF|5 
$ sort -t '|' -k 3,3nr -k 1,1 -k 2,2 file 
b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 
$ sort -t '|' -k 3,3nr file 
b|textC|5 
b|textF|5 
c|textB|4 
d|textE|4 
a|textA|2 
e|textD|1 
$ 

n в 3,3nr означает цифровой сортировки, r средство обратного. Похоже, -k 1,1 -k 2,2 не является обязательным, так как я думаю, sort будет сортировать по по возрастанию по умолчанию.

+0

Не понимаю. Я сделал два шага: 1. 'sort -t '|' -k 3,3nr -k 1,1 -k 2,2 path/to/input.txt> path/to/pass1output.txt' 2. 'sort -t '|' -k 3,3nr path/to/pass1output.txt> path/to/output.txt' Выход отличается от того, что я хочу. –

+0

Он дает результат, который отличается от того, что я хочу. Вы проверили «** wishOutput.txt **»? Сравните это с итоговым файлом вашего ответа. –

+0

После первого шага (см. Комментарий выше) - 'b | textF | 5, b | textC | 5, c | textB | 4, d | textE | 4, a | textA | 2, e | textD | 1'. После этого второй шаг не дает желаемого результата. И почему вы дублировали 'sort -t '|' -k 3,3nr'? –

0

Если это UNIX:

sort -k 3 path/to/input.txt > path/to/output.txt 

Вы можете использовать несколько флагов -k для сортировки более одного столбца. Например, для сортировки по третьему колонку, то 1-й столбец в качестве галстука выключателя:

sort -k 3,2 -k 1,1 input.txt > output.txt 

Соответствующих вариантов от "человека своего рода":

-k, --key = ПОЗ1 [, POS2]

запустите ключ в POS1, положите его на POS2 (начало 1)

POS - F [.C] [OPTS], где F - номер поля, а C - позиция символа в поле. OPTS - это один или несколько вариантов однобуквенного заказа, которые переопределяют глобальные параметры заказа для этого ключа. Если ключ не указан, используйте всю строку в качестве ключа.

-t, --field-сепаратор = сентябре

использование сентября вместо непустой на пустой перехода.

0

Вы можете сделать это только Sort Команда: -

sort -t"|" -k3 -n -k1 -k2 inputFile.txt 

k3 указания такого рода в соответствии с 3-го столбца и аналогично k1 & k2 согласно колонке 1 & второй соответственно.

+0

Но как объединить сортировку по убыванию (численно) для столбца 3 и сортировки по возрастанию (по алфавиту) для столбцов 1 и 2? –

Смежные вопросы