В bash, как объединить вывод двух команд и добавить их в одну и ту же строку файла?

Например, у меня есть две команды здесь:

{ command1 & command2; } >> file1

Например, вывод command1 является 400и вывод command2 является 4,

Так вот что я получаю:

400
4

Я хочу, чтобы результаты двух команд добавлялись в одну строку следующим образом:

400 4

2 ответа

Ваша команда в основном такова.

$ (echo '400'  && echo '4') | hexdump -C
00000000  34 30 30 0a 34 0a                                 |400.4.|
00000006

Не вывод включает в себя конец строки \n ака 0a персонажи. Таким образом, одна простая вещь, которую вы можете сделать, это передать это через команду, которая удалит \n,

Так как то так

$ (echo '400'  && echo '4') | tr '\n' ' ' | hexdump -C
00000000  34 30 30 20 34 20                                 |400 4 |
00000006

Который имеет фактический выход 400 4, Но это не включает окончания строк, поэтому вы можете удалить только конец строки из первой команды.

$ (echo '400' | tr '\n' ' ' && echo '4') | hexdump -C
00000000  34 30 30 20 34 0a                                 |400 4.|
00000006

В любом случае, дело в том, что конец строки - это просто символ, использующий tr, sed, awk или ваш любимый инструмент, который позволяет вам манипулировать строкой.

Еще один вариант, который может сработать, в зависимости от ваших требований, может заключаться в следующем. При этом вывод команд волшебным образом удаляется из EOL для вас, но EOL добавляется командой echo.

$ echo "$(echo '400') $(echo '4')" | hexdump -C
00000000  34 30 30 20 34 0a                                 |400 4.|
00000006

Я бы использовал paste

{ command1 & command2; } | paste -d" " -s >> file1

(обеспокоенность по поводу фоновой команды1 была отмечена)

Демо-версия:

$ { echo 400; echo 4; }
400
4
$ { echo 400; echo 4; } | paste -d" " -s
400 4
Другие вопросы по тегам