Merge entries in two files by column [bash, sed, awk]
Есть два файла:
$> cat 1.file $> cat 2.file
ABC-123;x; ABC-123;y;100;
XYZ-987;x; XYZ-987;y;299;
ABC-456;x; XYZ-987;y;290;
ABC-456;y;400;
Я хотел бы получить итоговый файл в следующем виде:
$> cat 3.file
ABC-123;x;y;100;
XYZ-987;x;y;299;
XYZ-987;x;y;290;
ABC-456;x;y;400;
- Объединить данные по первому столбцу
- Дублировать столько раз XYZ-987 в
3.file, сколько XYZ-987 встречается в файле2.file
Ответы (1 шт):
Автор решения: Evgeny Anisimov
→ Ссылка
Пока что идеи таковы:
# Проходимся по всем ключам 1.file
# сохраняя первый столбец в f1, а остаток строки в row1
while IFS=';' read -u3 -r f1 row1; do
# Если ключ из 1.file есть в 2.file
if grep -icq ${f1} 2.file; then
# То получаем строки из 2.file по $f1
# через sed back-references \1 + \2
# и компануем строку через \1$row1\2
sed -rn "s/($f1;)(.*)/\1$row1\2/p" 2.file >> 3.file
else
# Иначе просто печатаем строку из 1.file как есть
printf "%s;%s\n" "${f1}" "${row1}" >> 3.file
fi
# Пишем в 3ий дескриптор столбцы разделяемые ;
# Где -f1 пойдет в $f1
# Где -f2- пойдет в $row1
done 3< <(cut -d';' -f1,2- 1.file)