У меня есть файл с полем фиксированной ширины, который я пытаюсь отсортировать с помощью утилиты сортировки UNIX (в моем случае Cygwin).
Проблема в том, что в верхней части файла есть двухстрочный заголовок, который сортируется в конец файла (поскольку каждая строка заголовка начинается с двоеточия).
Есть ли способ указать sort либо «пропустить первые две строки через несортированные», либо указать порядок, при котором строки с двоеточиями сортируются вверх - остальные строки всегда начинаются с 6-значного числа (которое на самом деле является ключом I сортирую по) если что поможет.
Пример:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
следует отсортировать по:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
unix
sorting
command-line
Роб Гиллиам
источник
источник
Ответы:
Скобки создают подоболочку, заключающую в себе стандартный вывод, чтобы вы могли передать его по конвейеру или перенаправить, как если бы он поступил из одной команды.
источник
tee >(head -n $header_size) | tail -n +$header_size | sort
, но кажется, что голова бежит заtail|sort
трубкой, поэтому в конце концов печатается заголовок. Это детерминированное состояние или состояние гонки?cat
для перенаправления stdin во временный файл, а затем запустить указанную выше команду для этого нового файла, но он начинает становиться достаточно уродливым, поэтому, вероятно, лучше использовать одно из решений на основе awk, приведенных в другие отзывы.Если вы не против использования
awk
, вы можете воспользоватьсяawk
встроенными возможностями канала.например.
Это напечатает первые две строки дословно и завершит остальные
sort
.Обратите внимание, что у этого есть очень конкретное преимущество, заключающееся в возможности выборочной сортировки частей конвейерного ввода. все остальные предложенные методы будут сортировать только простые файлы, которые можно читать несколько раз. Это работает с чем угодно.
источник
$0
,print
достаточно.Вот версия, которая работает с данными по конвейеру:
Если ваш заголовок состоит из нескольких строк:
Это решение отсюда
источник
extract_data | (read h; echo "$h"; sort)
его достаточно коротко, чтобы его запомнить. ваш пример охватывает больше крайних случаев. :) Это лучший ответ. работает на трубах. нет awk.extract_data | (read; sort)
В простых случаях
sed
может сделать работу элегантно:или эквивалентно,
Ключ находится в
1q
- напечатать первую строку (заголовок) и выйти (оставив остальную часть вводаsort
).Для приведенного примера
2q
подойдет.-u
Переключатель (небуферизован) необходим для тех , ктоsed
с ( в частности, в GNU) , которые могли бы читать вход на куски, таким образом , потребляющего данные , которые вы хотите пройтиsort
вместо этого.источник
Вы можете использовать
tail -n +3 <file> | sort ...
(tail выведет содержимое файла с 3-й строки).источник
пример:
источник
Требуется всего 2 строчки кода ...
Для числовых данных требуется -n. Для альфа-сортировки параметр -n не требуется.
Пример файла:
$ cat test.txt
Результат:
$ cat a.tmp
источник
Итак, вот функция bash, аргументы которой точно такие же, как sort. Вспомогательные файлы и трубы.
Как это устроено. Эта строка проверяет, есть ли хотя бы один аргумент и является ли последний аргумент файлом.
Это сохраняет файл как отдельный аргумент. Поскольку мы собираемся стереть последний аргумент.
Здесь мы убираем последний аргумент. Поскольку мы не хотим передавать его как аргумент сортировки.
Наконец, мы выполняем часть awk, передавая аргументы (за вычетом последнего аргумента, если это был файл) для сортировки в awk. Это было первоначально предложено Дейвом и изменено, чтобы принимать аргументы сортировки. Мы полагаемся на тот факт, что
$file
он будет пустым, если мы проводим трубопровод, поэтому его игнорируют.Пример использования с файлом, разделенным запятыми.
источник
С Python:
источник
Вот функция оболочки bash, полученная из других ответов. Он обрабатывает как файлы, так и каналы. Первый аргумент - это имя файла или "-" для стандартного ввода. Остальные аргументы передаются на сортировку. Пара примеров:
Функция оболочки:
источник
Это то же самое, что и ответ Яна Шербина, но моя реализация: -
источник
Это сделает то, что вы хотите.
источник