Добавление другого суффикса в конец строки
У меня есть текстовый файл, который содержит следующее:
John Jack Jerry
У меня есть другой текстовый файл:
- Файлы по умолчанию в домашнем каталоге для каждого пользователя
- Как сохранить файл в ОЗУ
- Альтернативное решение для создания нескольких копий одного файла с помощью командной строки?
- Использование find и sed для копирования 20-й строки многих файлов в один файл
- Удалить все файлы с исполняемым разрешением в каталоге
2017 2015 2018
И я хочу сделать так:
John2017 John2015 John2018 Jack2017 Jack2015 Jack2018 Jerry2017 Jerry2015 Jerry2018
Как я могу это сделать?
- Перемещение уникальных файлов из папки с дубликатами файлов
- При добавлении содержимого в начале файла происходит обновление всех блоков данных?
- Сортировка каталогов по последним измененным датам / времени файла с одинаковым именем
- Как перемещать файлы с тем же именем и объединяться
- Как cp или rm-файлы на основе прав собственности / разрешения
- проверка достоверности всех файлов в папке в зависимости от shebang
- Как использовать sudo для запуска нескольких команд в качестве другого пользователя в части скрипта?
- Какие блоки размера используют `truncate -io-blocks`?
3 Solutions collect form web for “Добавление другого суффикса в конец строки”
Предполагая, что файлы невелики, может быть целесообразно прочитать их в массивы (с bash
или ksh93
):
names=( $( <names.txt ) ) years=( $( <years.txt ) )
Затем вы можете построить двойной цикл, который объединяет каждое имя с каждым годом:
for n in "${names[@]}"; do for y in "${years[@]}"; do printf '%s%s\n' "$n" "$y" done done
Если years.txt
мал, но names.txt
большой:
years=( $( <years.txt ) ) while read n; do for y in "${years[@]}"; do printf '%s%s\n' "$n" "$y" done done <names.txt
Результат:
John2017 John2015 John2018 Jack2017 Jack2015 Jack2018 Jerry2017 Jerry2015 Jerry2018
Обработка файлов в виде файлов с одним столбцом, без заголовков, CSV:
$ csvsql -H --query "SELECT * FROM names CROSS JOIN years" names.txt years.txt | sed -e '1d' -e 's/,//'
Это выполняет операцию реляционного перекрестного соединения по данным в двух таблицах, а затем продолжает csvsql
первую строку вывода вместе со всеми запятыми ( csvsql
создает правильно отформатированный CSV с линией заголовка и значениями, разделенными запятыми).
csvsql
является частью csvkit
.
Решение, которое @ Kusalananda предоставило, превосходит его. Я предоставил его, не задумываясь о том, что $(cat ...)
делает с точки зрения использования памяти. Я оставлю его здесь для справки – он будет работать и не страшен, если файлы маленькие.
#!/bin/bash for name in $(cat names); do for year in $(cat years); do echo "${name}${year}" done done
$ join -j2 -t : names year | tr -d :
- соединить не существующее поле и удалить разделители выходных полей.
Поле 2 пусто и равно для всего элемента в names
и year
поэтому join
объединяет каждое имя с годами: он фактически вычисляет декартово произведение.