2015-06-01 2 views
1

Я хочу отсортировать файл, используя первые шесть символов строки. Он должен игнорировать порядок сортировки по умолчанию после шестого символа. Я попытался использовать команду ниже, но система принимает порядок сортировки по умолчанию после шестого символа.Сортировка файла в unix с использованием первых шести символов строки

sort -k 1,6 filename.txt 

входной файл: "filename.txt"

09289720150531N201505220820D20150514 
09289720150531N201505220820A20150516 
08806020150531N201505290810D20150526 
08806020150531N201505290810A20150528 

Вывод должен быть:

08806020150531N201505290810D20150526 
08806020150531N201505290810A20150528 
09289720150531N201505220820D20150514 
09289720150531N201505220820A20150516 

Но мой выход команды:

08806020150531N201505290810A20150528 
08806020150531N201505290810D20150526 
09289720150531N201505220820A20150516 
09289720150531N201505220820D20150514 

ответ

3

Опция, как показано использует поле позиция. Если вы измените это на что-то вроде -k1.1,1.6, он будет использовать позицию в первом поле. Это функция extended POSIX, которая может быть предоставлена ​​на большинстве платформ.

Однако в вашем примере есть только два разных значения в позициях символов 1-6: 088060 и 092897. Стандартная команда сортировки не имеет функции для , игнорируя колонки, но только для с использованием столбцов. Хотя сортировка GNU предоставляет расширение (-s для «отключения последнего сравнения»), сортировка Solaris не имеет такого расширения. После того, как ключи сортировки были учтены, он сортируется по остальной части строк.

Там является некоторые расплывчатые формулировки в руководстве, которое намекает, что -u будет делать то, что вы хотите:

При наличии нескольких ключевых полей, а затем ключи сравниваются только после того, как все предыдущие ключи считаются равными. Кроме случаев, когда указана опция -u, строки, которые в противном случае сравнения равны упорядочиваются, если ни один из вариантов -d, -f, -i, -n или -k не присутствовал (но с -r все еще в силе, если он был указан) и со всеми байтами линии, значимые для сравнения.

Однако — пересматривают это — формулировка от этого вводит в заблуждение, так как -u используется для фильтрации дубликатов.

Комментарий предполагает, что -k1.1,1.6 можно укоротить до -k1.6, а тестирование с помощью Solaris 10 подтвердило бы, что это сработает. То есть с /usr/bin/sort, конечно. На моем экземпляре Solaris 10, есть дополнительная копия рода, в /opt/sfw/bin/sort:

$ /opt/sfw/bin/sort --version 
sort (GNU coreutils) 5.97 

и что программа поддерживает возможность -s отмечено выше. С помощью этой опции программа выдает запрошенный результат.

+0

Я просто пробовал эту команду, но она не работала в среде Solaris. – srisriv

+0

вид -k1.1,1.6 образецe.txt – srisriv

+0

@srisriv 'sort -k1.6 file' должно быть достаточно. – fedorqui

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