使用Bash将来自2个文本文件的列作为矩阵进行比较

时间:2016-12-08 19:21:52

标签: bash matrix text-files

我有两个文本文件,我想以矩阵形式阅读。矩阵A(或文本文件A)是制表符分隔的,包含纬度列,经度列和名称列(以及其他内容)。矩阵B(或文本文件B)是制表符分隔的,包含纬度列和经度列(以及其他内容)。我想阅读其中的每一个,为列指定名称,循环通过A的纬度查找B中的匹配,如果有匹配,则比较经度,如果有匹配,写一个新矩阵C(文本文件C)具有lat,long和name(以及列中的其他信息)。我甚至不知道如何阅读这些内容并为列值指定名称。这可能吗?

1 个答案:

答案 0 :(得分:1)

如果你想要一个纯粹的Bash解决方案,那么沿着这些方向可以做到这一点:

file_a=A
file_b=B
file_c=C

while read -r lat_a long_a name_a acol ; do
    while read -r lat_b long_b bcol ; do
        if [[ $lat_a == "$lat_b" && $long_a == "$long_b" ]] ; then
            printf '%s\t%s\t%s\t%s\t%s\n' \
                "$lat_a" "$long_a" "$name_a" "$acol" "$bcol"
        fi
    done <"$file_b"
done <"$file_a" >"$file_c"

假设每个文件中有一个额外的列(第一个文件中为acol,第二个文件中为bcol)。它需要适应处理任何真正的列。

Bash代码为它读取的第一个文件的每一行重新读取整个第二个文件,因此如果文件很大,它将非常慢。

更好的选择可能是使用join命令。有关示例,请参阅Bash join command(但请注意标题具有误导性:join是一个不依赖于Bash的独立程序。)