我有两个文件,如下。我需要应用从 file1 到 file2 的 ID 号来匹配它们相应的主机名。所需的输出也在下面。如果可能的话,我更愿意使用 bash 脚本来完成此操作,但我对替代方案持开放态度。
文件1:
ID: 12345, Name: foo1.bar.com
ID: 12346, Name: foo2.bar.com
ID: 12347, Name: foo3.bar.com
ID: 12348, Name: foo4.bar.com
ID: 12349, Name: foo5.bar.com
文件2:
foo3.bar.com
foo4.bar.com
foo1.bar.com
foo5.bar.com
foo2.bar.com
期望的输出 -
12347 foo3.bar.com
12348 foo4.bar.com
12345 foo1.bar.com
12349 foo5.bar.com
12346 foo2.bar.com
关于解决这个问题的最佳方法有什么想法吗?
答案1
从第一个文件创建一个查找表/哈希/关联数组,然后使用第二个文件的内容键入它:
awk -F'[ ,]+' 'NR==FNR {a[$NF] = $2; next} $1 in a {print a[$1], $1}' file1 file2
12347 foo3.bar.com
12348 foo4.bar.com
12345 foo1.bar.com
12349 foo5.bar.com
12346 foo2.bar.com
答案2
根据示例文件,钢铁司机的回答
(在 中使用查找表/关联数组awk
)可能是最好的解决方案。虽然通常不建议这样做,但您可以纯粹在 bash 中执行相同的操作:
declare -A id
while IFS=" ," read x idnum xx name
do
id[$name]=$idnum
done < file1
while read name
do
printf '%s %s\n' "${id[$name]}" "$name"
done < file2
逻辑是一样的:
- 第一遍,创建一个数组,按名称值索引,包含 ID 值。
- 第二遍,将名称映射到 ID 并将它们并排输出。
对于问题中的示例数据,我的答案按预期(即按指定)工作。 (由于它使用数组——具体来说,关联数组——它需要 bash(或 ksh、zsh 或 yash);shell 的 POSIX 规范并未指定数组,并且并非在 Unix/ 中使用的所有 shell 中都可用。 Linux。)由于 bashread
命令的工作方式,我的答案还可以处理多单词名称(即其中包含空格的名称),正如人们直观所期望的那样:
file1 file2 output
ID: 42, Name: fat cat fat cat 42 fat cat
ID: 95, Name: Superman under dog 83 under dog
ID: 83, Name: under dog spider man ⟹ 17 spider man
ID: 9, Name: cat woman spider pig 60 spider pig
ID: 17, Name: spider man Superman 95 Superman
ID: 60, Name: spider pig cat woman 9 cat woman
请注意,两个答案都区分大小写;例如,foo1.bar.com
不会匹配Foo1.bar.com
。