paste
Склеить файлы построчно в столбцы или собрать все строки файла в одну через разделитель
paste склеивает файлы «бок о бок»: первая строка первого файла + первая строка второго, затем вторые строки и так далее. С -s работает иначе — собирает все строки одного файла в одну строку. Им делают из столбца список через запятую, складывают числа (paste -sd+) и раскладывают поток по колонкам.
Синтаксис
paste [опции] [файл…]
paste -s -d, файл # все строки в одну через запятую
команда | paste - - # по две строки ввода в одну
Без файлов или с - читает стандартный ввод. Каждый - берёт со стандартного ввода очередную строку, поэтому paste - - - раскладывает поток по три значения в строку.
Опции
| Опция | Что делает |
|---|---|
-d СПИСОК | разделители вместо табуляции. Каждый символ списка используется по очереди, по кругу |
-s | «последовательно»: каждый файл целиком превращается в одну строку |
-z | строки разделены нулевым байтом, а не \n |
Спецсимволы в -d
| Запись | Что значит |
|---|---|
\t | табуляция (по умолчанию) |
\n | перевод строки |
\\ | обратный слэш |
\0 | пустой разделитель: склеить без промежутка (то же, что -d '') |
Бери список в одинарные кавычки, чтобы обратные слэши дошли до paste, а не обработались оболочкой.
Примеры
printf 'a\nb\nc\n' > letters.txt
printf '1\n2\n' > numbers.txt
# два столбца через табуляцию
paste letters.txt numbers.txt
# через запятую — получился CSV
paste -d, letters.txt numbers.txt
# все строки — в одну
paste -s letters.txt # через табуляцию
paste -sd, letters.txt # a,b,c
# сумма столбца чисел (bc в песочнице нет — используй арифметику bash)
echo $(( $(seq 5 | paste -sd+) ))
# поток по две / по три строки в одну
seq 6 | paste - -
seq 6 | paste -d, - - -
# пары «ключ: значение» с разными разделителями по очереди
printf 'host\nport\n' > keys.txt
printf 'db\n5432\n' > vals.txt
paste -d: keys.txt vals.txt
# по кругу: запятая, затем перевод строки — пары через запятую
seq 6 | paste -sd ',\n'
# склеить без разделителя
paste -d '' letters.txt numbers.txt
# стандартный ввод как второй столбец
paste letters.txt - < numbers.txt
Подводные камни
-d— это список одиночных символов, а не строка.paste -d ', ' a b cставит запятую между первым и вторым столбцом, а пробел — между вторым и третьим. Разделитель из нескольких символов (,) так не сделать: склей через-d,и потом замени через sed, или собери строку в awk.- Файлы разной длины не ошибка. Недостающие строки считаются пустыми:
cиз длинного файла получит пустой второй столбец (c\tилиc,). Проверяй длины черезwc -l, если это важно. \rиз Windows-файлов «прячется» внутри строки:pasteсклеитx\rиa, и в терминале вывод выглядит испорченным. Убери\rзаранее (tr -d '\r').paste -sd+ | bc— частый рецепт, ноbcв песочнице не установлен. Используй$(( … ))для целых илиawk '{s+=$1} END {print s}'для дробных.-sс несколькими файлами даёт по строке на каждый файл, а не одну общую строку.- Последний символ
-dпри-sне повторяется в конце строки:paste -sd,наa b cдастa,b,cбез завершающей запятой.