嵌套for循环中的vlookup样式查询(

时间:2013-02-27 21:24:21

标签: bash for-loop nested vlookup

我一直在使用这个问题中的建议: Find value from one csv in another one (like vlookup) in bash (Linux)

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

数据文件示例(* .data)

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

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

marker1     66%
marker2     34%

第二个参考文件示例(ref2.txt,要查找的第二个文件)

info1     exact
info2     partial

需要输出

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 "%s\t" $i;
    grep "${KEY}" /path/ref1.txt | cut -f 2 ; 
done
done

我认为我编写的脚本有两个问题 输出当前是每个输入文件一行,而不是附加的输入文件的所有行,它是文件的文件名而不是文件中的一行。参考位看起来确实有效(从我用一行输出可以看出)。 I,E:

/path/1.data    66%

任何人都可以告诉我出了什么问题,或者请建议一个更聪明的方法来做到这一点? 非常感谢。

1 个答案:

答案 0 :(得分:2)

这有一个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>是两个文件中字段编号相同时可以使用的快捷方式。