如何使用2列映射文件将与第二个文件中的一列关联的数据分配给另一个文件中的另一列

时间:2015-06-22 17:46:48

标签: bash

我有一个如下所示的mapping.txt:

x1      yn
xd      y4
x5      y7

和file2看起来像:

y4      0.1
y7      0.3
yn      0.7

我想使用mapping.txt来获得这样的输出:

x1      0.7
xd      0.1
x5      0.3

例如:xd对应于y4(mapping.txt),因此y4(0.1)的值被赋值给xd。

我可以通过一些排序和列操作来做到这一点,但我正在寻找实际遵循相同算法的东西(使用bash)。

2 个答案:

答案 0 :(得分:3)

$ join -1 2 -o 1.1,2.2 <(sort -k 2,2 mapping.txt) <(sort file2)
xd 0.1
x5 0.3
x1 0.7

join要求输入文件在连接字段上排序,因此我在第二个字段上对映射进行排序,file2按(默认)第一个字段排序。

-o选项控制输出:打印出第一个文件中的第一个字段和第二个文件中的第二个字段

<(...)语法为process substitution - 它们执行包含的sort命令,然后join能够处理看起来像文件的输出。< / p>

答案 1 :(得分:2)

首先,您遍历file2并将每一行存储在一个数组中,使用第一列作为索引,第二列作为值。构建此数组后,遍历mapping.txt并打印第一列,然后打印第二列中元素的数组值。这导致以下单行:

awk 'NR==FNR{maps[$1]=$2} NR!=FNR{print $1 "    " maps[$2]}' file2 mapping.txt

或者您可以将其存储在awk脚本中:

# if first file (file2)
NR==FNR{
    # store column entries in array maps
    # key is the first column, value the second
    maps[$1] = $2
}
# if second file
NR!=FNR{
    # print first column and mapped value for second column
    print $1 "    " maps[$2]
}