echo >> не работает

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-й строки

1
03.07.2017, 00:02
3 ответа

Вот как анализируется ваша команда:

  • (…)— составная команда. Содержимое скобок выполняется в подоболочке.
    • лс | так | 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
1
27.01.2020, 23:14

Для достижения указанного результата можно сделать следующее:

echo -e "`ls | tac`\n" > ./foobar

Таким образом, вывод lsпередается через tac. Результат содержится в команде echo, а интерпретация управляющего символа echoдобавит новую строку. Затем стандартный вывод можно перенаправить в файл.

Я не верю, что можно направить стандартный вывод в эхо.

2
27.01.2020, 23:14

>>указывает оболочке добавлять вывод команд к имени файла сразу после символов (так что вам, по крайней мере, нужно будет добавить имя перед закрывающей скобкой) .

Для того, что вы хотели бы сделать, вы могли бы сделать либо:

ls | tac > ./foobar; echo >>./foobar

или:

(ls | tac; echo ) >./foobar

Оба достигают одного и того же результата.

3
27.01.2020, 23:14

Теги

Похожие вопросы