Многие знают команду
cat, которая чаще всего используется для чтения файлов, и могут удивляться ее названию, недоумевая – причем тут кошки. На самом деле команда cat выполняет конкатенацию – т.е. соединение текстовых строк.
Допустим нам надо объединить два текстовых файла. Самый простой вариант:
cat two.txt >> one.txt
После чего содержимое второго файла будет добавлено в конец первого. Но здесь мы использовали только перенаправление, а cat просто прочитал второй файл.
А если нужно наоборот, сначала содержимое второго файла, а потом первого?
В этом случае нам как раз потребуется конкатенация с перенаправлением результата в новый файл:
cat two.txt one.txt >> result.txt
Подобные задачи очень часто встречаются на практике, поэтому подобными инструментами нужно владеть на всех используемых платформах.
Говоря о платформе Windows на ум сразу приходит PowerShell, но, вопреки мнению о скудости и убогости, CMD тоже есть что нам предложить.
Практически полным аналогом команды
cat в CMD является type.И это не «тип» как вы могли подумать, а «тайп», глагол имеющий значение «печатать», сразу можно вспомнить «телетайп».
Те же самые команды будут выглядеть как:
type two.txt >> one.txt
type two.txt one.txt >> result.txt
И да, перенаправление в Windows тоже есть и было с незапамятных времен.
При этом работа и cat и type имеет свою особенность, они предполагают, что файл должен заканчиваться последовательностью
EOF (End of File) ну или содержать в конце символ переноса строки.Иначе вместо ожидаемого результата:
строка_файла_1
строка_файла_2
Вы можете получить и получите:
строка_файла_1строка_файла_2
В Linux это обычно не составляет проблемы, все текстовые редакторы, хоть консольные, хоть графические корректно завершают файл. А вот тот же Блокнот способен доставить проблем.
Ну и наконец PowerShell, для этого у него имеется специальный командлет
Get-Content. А так как PowerShell имеет объектную модель, то результатом его работы будет набор объектов, каждый из которых будет содержать строку исходного файла.Чтобы прочитать содержимое файла выполните:
Get-Content -Path one.txt
Но можно написать проще:
Get-Content one.txt
Если нужно выполнить конкатенацию, то перечислите нужные файлы через запятую.
В PowerShell указанные выше команды будут выглядеть так:
Get-Content two.txt >> one.txt
Get-Content two.txt, one.txt >> result.txt
А так как PowerShell возвращает нам набор объектов по одному на строку, то для него не имеет значения завершается ли файл EOF или нет. Результат всегда будет ожидаем.
