合并两个顺序不同的文件中的数据。

合并两个顺序不同的文件中的数据。

我有两个文件,如下。我需要应用从 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

逻辑是一样的:

  1. 第一遍,创建一个数组,按名称值索引,包含 ID 值。
  2. 第二遍,将名称映射到 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

相关内容