paste
— хороший выбор, если нам просто нужно объединить строки файлов.
Чтобы добавить строку headerс именами файлов, используйте комбинациюawk+paste:
{ for f in file*; do awk '{ for(i=1;i<=NF;i++) printf("%s\t",FILENAME); exit }' "$f"; done;
echo ""; paste -d"\t" file*; } | column -t
Вывод (для 3 входных файлов):
file1 file1 file2 file2 file3 file3
a 1 a 10 a 0
b 2 b 20 b 0
c 3 c 40 c 0
Детали:
{ команда; команда; ...}
- используется для объединения выходных данных нескольких команд
для f в файле*;
- для каждого файла
printf("%s\t",FILENAME)
- печать имя файла для каждого столбца соответствующего файла
exit
- выход сразу после обработки 1-й строки
Вот как анализируется ваша команда:
(…)
— составная команда. Содержимое скобок выполняется в подоболочке.
лс | так | echo >>
— конвейер, состоящий из трех частей: ls
, tac
и echo >>
. Выход самой левой части подключен к входу второй части, а выход второй части подключен к входу самой правой части.ls
— простая команда, запускающая исполняемый файл.tac
— простая команда, запускающая исполняемый файл.echo >>
не является синтаксически правильным. За оператором >>
должно следовать имя файла, а имя файла отсутствует.> ./foobar
перенаправляет вывод составной команды в файл ./foobar
.Направление ввода на echo
не имеет смысла: он не считывает ввод. Чтобы использовать echo
для добавления к выводу какой-либо другой команды, запустите echo
после другой команды, а не параллельно.
ls | tac; echo
Вывод echo
направляется в то же место, что и вывод tac
, поэтому перенаправление не требуется.
( ls | tac; echo ) >./foobar
Здесь подоболочка не нужна. Подойдет простая группировка. (См. Простые логические операторы в Bashдля краткого обзора операций, подобных скобкам в bash.)
{ ls | tac; echo; } >./foobar
Использование оператора >>
для добавлениябудет необходимо только если вы добавляли к уже существующему файлу.Здесь это не так: все команды находятся в одном месте, файл foobar
открывается только один раз и остается открытым, пока выполняется вся составная команда. Оператор >>
потребуется, если вы откроете файл дважды:
ls | tac >./foobar; echo >>./foobar
Для достижения указанного результата можно сделать следующее:
echo -e "`ls | tac`\n" > ./foobar
Таким образом, вывод ls
передается через tac
. Результат содержится в команде echo
, а интерпретация управляющего символа echo
добавит новую строку. Затем стандартный вывод можно перенаправить в файл.
Я не верю, что можно направить стандартный вывод в эхо.
>>
указывает оболочке добавлять вывод команд к имени файла сразу после символов (так что вам, по крайней мере, нужно будет добавить имя перед закрывающей скобкой) .
Для того, что вы хотели бы сделать, вы могли бы сделать либо:
ls | tac > ./foobar; echo >>./foobar
или:
(ls | tac; echo ) >./foobar
Оба достигают одного и того же результата.