【问题标题】:vlookup style query in nested for loop (嵌套 for 循环中的 vlookup 样式查询(
【发布时间】:2013-02-27 21:24:20
【问题描述】:

我一直在使用这个问题的建议: 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 准确
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 "%s\t" $i;
    grep "${KEY}" /path/ref1.txt | cut -f 2 ; 
done
done

我认为我编写的脚本存在两个问题 当前的输出是每个输入文件一行,而不是附加的输入文件的所有行,它是文件的文件名而不是文件中的一行。不过,参考位似乎确实有效(据我所知,单行输出)。 我,即:

/path/1.data    66%

谁能告诉我出了什么问题,或者请提出一个更聪明的方法来做到这一点? 非常感谢。

【问题讨论】:

    标签: bash for-loop nested vlookup


    【解决方案1】:

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

    【讨论】:

    • 这真的很有用,谢谢。比循环简单得多(尽管乍一看有点令人生畏!)
    • 需要大量输入...要使其更短一点,您可以使用join -1 6 -2 1 test.data ref.txt | join -j 1 - ref2.txt,但输出的顺序可能与您想要的有所不同。这可以通过awk 中的后处理步骤轻松纠正,但如果它很关键的话。
    • 请问,这是否排除了没有共享密钥的条目?我可能不得不发布另一个问题,但是有没有办法在 ref 文件中没有与数据文件匹配的条目的地方放置一个空格或 0?谢谢。
    • 查看join 的手册页。如果需要,还可以选择打印未连接的行。但是,输入“默认”条目必须是预处理或后处理步骤。同样,awk 可能是这类事情最有用的实用程序,除非您更喜欢 pythonperl...
    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多