嵌套for循环中的Vlookup样式查询



我一直在使用这个问题的建议:在bash (Linux)中从一个csv查找另一个csv中的值(如vlookup)

尝试创建一个脚本,其中我遍历多个数据文件,并以vlookup样式的方式从其他几个(单个)参考文件添加列。

数据文件示例(*.data)

info1   7   44567    1   2  marker1
info2   3   143679   2   2  marker2

参考文件示例(ref.txt,要查找的文件)

marker1     66%
marker2     34%

第二个引用文件示例(ref2.txt,查找的第二个文件)

<>以前info1精确info2部分之前

输出要求

info1   7   44567    1   2  marker1   66%   exact
info2   3   143679   2   2  marker2   34%   partial

尝试循环(只显示一个引用文件,因为我还没有得到那个位工作!)

#!/bin/bash
for file in `ls /path/*.data`; 
do
for i in $file; 
do 
KEY=$(cut -f 6 $file);
    printf "%st" $i;
    grep "${KEY}" /path/ref1.txt | cut -f 2 ; 
done
done

我认为我写的剧本有两个问题当前的输出是每个输入文件的一行,而不是附加输入文件的所有行,它是文件的文件名,而不是文件中的一行。参考位似乎是工作虽然(从我可以告诉一行输出)。i, e:

/path/1.data    66%
谁能告诉我哪里出了问题,或者建议一个更聪明的方法来做这件事?多谢。

有一个join实用程序用于此。特别是,考虑到您的示例:

join -o 1.1,1.1,1.3,1.4,1.5,1.6,2.2 -1 6 -2 1 test.data ref.txt |
  join -o 1.1,1.1,1.3,1.4,1.5,1.6,1.7,2.2 -j 1 - ref2.txt

这将产生您建议的输出。-o <list>选项指定您希望以<filenumber>.<fieldnumber>格式打印的每个字段。-1 <n>-2 <n>分别指定要匹配的每个文件中的字段,-j <n>是当两个文件中的字段号相同时可以使用的快捷方式。

最新更新