Есть ли элегантный способ разделить (по строкам) STDOUT команды на две разные программы?
Вариант использования: у меня есть команда, которая распечатывает столбчатые данные, которые я хотел бы передать по конвейеру column -t
, но она также выводит некоторую общую информацию и журналы вверху, например
$ first-command
Connecting to XYZ
Total lines: 2
Id Status Type
id-001 INPROGRESS 5
id-002 PENDING 1
Если я передаю это на column
как есть, я получаю:
$ first-command | column -t
Connecting to XYZ
Total lines: 2
Id Status Type
id-001 INPROGRESS 5
id-002 PENDING 1
Вместо этого я хотел бы, чтобы он печатал первые две строки как обычно, а затем column
остальные, например.
$ first-command | split-stdout -n 2 "cat" "column -t"
Connecting to XYZ
Total lines: 2
Id Status Type
id-001 INPROGRESS 5
id-002 PENDING 1
Обновлено: подключение первых строк X прямо к STDOUT тоже нормально.
awk
работает.
У меня нет команды, выводящей этот вывод, поэтому я просто помещаю ее в образец файла:
$ cat column.txt
Connecting to XYZ
Total lines: 2
Id Status Type
id-001 INPROGRESS 5
id-002 PENDING 1
Подключив это к следующему awk
, вы получите желаемый результат:
$ cat column.txt | awk 'NR<=2{print;next}{print | "column -t"}'
Connecting to XYZ
Total lines: 2
Id Status Type
id-001 INPROGRESS 5
id-002 PENDING 1
В коде специально сказано для номеров строк <= 2:
NR<=2
просто распечатайте результат и перейдите к следующей строке:
{print; next}
.
Следующий блок выполняется для всех строк больше второй и выводится в конвейер для column -t
.
RE: удаленный комментарий: Nvm, я совершил одно преступление.
Вы можете использовать команду tee, чтобы "скормить" две разные команды одним и тем же вводом:
echo "hello world" | tee >(cut -d' ' -f2) | cut -d' ' -f1
выходы
hello
world
Для задания, которое вы пытаетесь выполнить, вы можете отправить вывод first-command
в tee
, затем распечатать первые 2 строки в выходной файл >(head -2 > output)
и распечатать остальные строки, чтобы обработать их в том же выходном tail -n +3 | column -t >> output
.
По какой-то причине, когда я делаю first-command | tee >(cut -d' ' -f1) | cut -d' ' -f3
, он работает правильно (конвейер выводит третий столбец, подоболочка выводит первый столбец), но когда я пытаюсь выполнить first-command | tee >(cut -d' ' -f1,2) | cut -d' ' -f3
, второй cut
теперь также применяется к результату подоболочки ... pipe выводит третий столбец, подоболочка выводит пустые строки.
извините, я не достаточно ясно, я имел в виду сделать это для вашего конкретного случая first-command | tee >(head -2 > output) | tail -n +3 | column -t >> output
, если вы cat
выходной файл, он должен быть тем, что вы хотите. Отредактировал ответ, чтобы было понятнее
Ах, понятно, спасибо! Этот синтаксис tee >(subcommand)
полезен. Я должен иметь это в виду.
Ах, это сработало! Похоже, мне нужно выучить еще немного
awk
. Большое спасибо!