У меня есть файл, содержащий пары имя / значение папок:
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
Единственная идея, которая у меня есть:
Вопрос: есть ли для этого какой-то стандартный инструмент командной строки?
С 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
это показало мне образец вывода, который вы нам показали.