Назад | Перейти на главную страницу

Скрипт для объединения данных из одного файла в другой

У меня есть файл, содержащий пары имя / значение папок:

peter:/home/peter/
max:/home/max-lucas/
judith:/home/judith/documents/

У меня есть другой файл, содержащий пары имя / значение файлов с такими же именами:

max:todo.txt
peter:calendar.txt
peter:notes.txt
peter:dummy.txt

Это своего рода база данных.
С настоящими файлами все не так просто. Мне нужно извлечь данные с помощью sed, но дело не в этом.

 

Я хочу объединить два файла:

/home/peter/calendar.txt
/home/peter/notes.txt
/home/peter/dummy.txt
/home/max-lucas/todo.txt

 

Единственная идея, которая у меня есть:

  1. перейти к первому файлу, чтобы создать массив имени / значения
  2. перебрать второй файл и собрать каждую строку с правильным значением из массива

 

Вопрос: есть ли для этого какой-то стандартный инструмент командной строки?

С awk это просто:

awk -F ":" 'FNR==NR{a[$1]=$2;next} $1 in a { print a[$1]$2}' homedir.txt file.txt

Мне не удалось найти для этого инструмент cli, но я мог бы найти способ перебрать ваши файлы, чтобы получить желаемый результат. Сначала нам нужно создать пару ключей и значений пользователей и их каталогов.

declare -A users
for i in $(cat file1);do users+=( [$(echo $i | awk -F ':' '{print $1}')]=$(echo $i | awk -F ':' '{print $2}')) ; done

Теперь мы создали пару «ключ-значение». В этом можно убедиться, просмотрев содержимое словаря.

for i in "${!users[@]}"; do echo "$i - ${users["$i"]}"; done 

Теперь мы перебираем второй файл и в операторе печати заменим пользователя на его каталог.

for i in $(cat file2);do echo ${users[$(echo $i|awk -F ':' '{print $1}')]}$(echo $i|awk -F ':' '{print $2}')  ; done

это показало мне образец вывода, который вы нам показали.