我有一个如下所示的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)。
答案 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单行:
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]
}