Это можно сделать с помощью sed
как:
Код:
sed '/C.*C/p;/C/d' file1
Результаты:
DTHGTY
HYTRHD
HTCCYD
Как?
C
через /C.*C/p
C
через /C/d
, сюда входят строки, уже напечатанные на шаге 1 Решение, которое предоставил @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 пусто и одинаково для всех элементов в name
и year
, поэтому join
объединит каждое имя со всеми годами: это на самом деле вычисление декартова произведения.
Предполагая, что файлы маленькие, их можно прочитать в массивы (с 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
If 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/,//'
Выполняется реляционная операция перекрестного соединения данных в двух таблицах, а затем выполняется on, чтобы удалить первую строку вывода вместе со всеми запятыми ( csvsql
создает правильно отформатированный CSV со строкой заголовка и значениями, разделенными запятыми).
csvsql
является частью csvkit
.