![将数据从一个文件合并到另一个文件的脚本](https://linux22.com/image/678566/%E5%B0%86%E6%95%B0%E6%8D%AE%E4%BB%8E%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E5%90%88%E5%B9%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我有一个包含文件夹名称/值对的文件:
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
我唯一的想法是:
- 迭代到第一个文件以创建名称/值数组
- 遍历第二个文件并使用数组中的正确值组装每一行
问题:是否有为此制作的标准 CLI 工具?
答案1
使用 awk 很容易:
awk -F ":" 'FNR==NR{a[$1]=$2;next} $1 in a { print a[$1]$2}' homedir.txt file.txt
答案2
我找不到用于此目的的 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
这向我展示了您向我们展示的示例输出。