Я получаю вывод из программы, которая сначала создает одну строку, которая представляет собой группу заголовков столбцов, а затем группу строк данных. Я хочу вырезать различные столбцы этого вывода и просматривать их отсортированные по различным столбцам. Без заголовков, режущие и сортировка легко осуществляются с помощью -k
опции , чтобы sort
вместе с cut
или awk
просмотреть подмножество столбцов. Однако этот метод сортировки смешивает заголовки столбцов с остальными строками вывода. Есть ли простой способ держать заголовки наверху?
text-processing
sort
table
jonderry
источник
источник
{ head -1; sort; }
работать. Он всегда удаляет кучу текста после первой строки. кто-нибудь знает, почему это произошло?head
читает более одной строки в буфер и выбрасывает большую часть ее. У моейsed
идеи была та же проблема.lseek
возможностью ввода, поэтому он не будет работать при чтении из канала. Это будет работать, если вы перенаправите файл,>outfile
а затем запустите{ head -n 1; sort; } <outfile
Ответы:
Похищение идеи Энди и превращение ее в функцию, облегчающую ее использование:
Теперь я могу сделать:
источник
ps -C COMMAND
может быть более уместным, чемgrep COMMAND
, но это всего лишь пример. Кроме того, вы не можете использовать,-C
если вы также использовали другой вариант выбора, например-U
.body
? Как вbody sort
илиbody grep
. Мысли?header
вbody
, потому что вы делаете действие на теле. Надеюсь, это имеет больше смысла.body
всех последующих участников трубопровода:ps -o pid,comm | body grep less | body sort -k1nr
<foo body sort -k2
илиbody sort -k2 <foo
. Всего один лишний персонаж из того, что вы хотели.Вы можете держать заголовок вверху вот так с помощью bash:
Или сделайте это с Perl:
источник
{}
порядке вместо()
?IFS=
отключает разделение слов при чтении ввода. Я не думаю, что это необходимо при чтении$REPLY
.echo
расширит экранирование обратной косой черты, еслиxpg_echo
установлено (не по умолчанию);printf
в этом случае безопаснее.echo $REPLY
без кавычек будет сгущать пробелы; Я думаюecho "$REPLY"
должно быть хорошо.read -r
необходим, если входные данные могут содержать экранирование обратной косой черты. Отчасти это может зависеть от версии bash.read REPLY; echo $REPLY
(лишних пробелов) иread; echo $REPLY
(не).xpg_echo
зависит от вашей системы, например, от Solaris, я думаю, что по умолчанию установлено значение true. Вот почему Жильprintf
так любит : это единственное, что предсказуемо.Я нашел хорошую версию awk, которая прекрасно работает в скриптах:
источник
sort
команду извне? Кто-нибудь знает хотя бы ссылку на страницу, объясняющую использование канала в awk?Резко, но эффективно: перед сортировкой добавьте
0
все строки заголовка и1
все остальные строки. Уберите первый символ после сортировки.источник
Вот некоторый волшебный шум Perl-строк, через который вы можете передать свой вывод, чтобы отсортировать все, но оставить первую строку наверху:
perl -e 'print scalar <>, sort <>;'
источник
Я попробовал
command | {head -1; sort; }
решение и могу подтвердить, что оно действительно все испортило -head
читает в несколько строк из канала, а затем выводит только первое. Таким образом, остальная часть вывода, которыйhead
не был прочитан, передается вsort
-NOT остальная часть вывода, начиная со строки 2!В результате вы пропускаете строки (и одну частичную строку!), Которые были в начале вывода вашей команды (за исключением того, что у вас все еще есть первая строка) - факт, который легко подтвердить, добавив канал
wc
в конце вышеупомянутый конвейер - но это чрезвычайно трудно отследить, если вы этого не знаете! Я потратил не менее 20 минут, пытаясь понять, почему у меня была неполная строка (первые 100 байт или около того, обрезанная) в моем выводе, прежде чем ее решить.То, что я в итоге сделал, что работало прекрасно и не требовало запуска команды дважды, было:
Если вам нужно поместить вывод в файл, вы можете изменить это следующим образом:
источник
head
встроенную в ksh93line
утилиту или утилиту (в системах, где она еще есть) илиgnu-sed -u q
илиIFS=read -r line; printf '%s\n' "$line"
, которая читает входные данные по одному байту за раз, чтобы избежать этого.Я думаю, что это проще всего.
или это, возможно, быстрее, так как не создает субоболочку
Другое крутое использование
перетасовать строки после строки заголовка
обратные строки после строки заголовка
источник
cat file | { head -n 1 ; sort ; } > file2
только покажи головуисточник
command
два раза. Поэтому он ограничен некоторыми конкретными командами. Однако для запрошеннойps
команды в примере это будет работать.Просто и понятно!
источник
command
дважды. Так что не очень подходит для использования в трубопроводе.Я пришел сюда в поисках решения для команды
w
. Эта команда показывает детали того, кто вошел в систему и что они делают.Чтобы показать отсортированные результаты, но с верхними заголовками (есть две строки заголовков), я остановился на:
Очевидно, что команда запускается
w
дважды и поэтому может не подходить для всех ситуаций. Тем не менее, к его преимуществам это значительно легче запомнить.Обратите внимание, что
tail -n +3
означает «показать все строки, начиная с 3-го и далее» (подробнее см.man tail
).источник
Попробуйте сделать:
источник