← Весь справочник

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 без завершающей запятой.

См. также

cut · join · column · tr · awk · seq