传递加入连接的输出

时间:2015-04-15 05:39:34

标签: shell unix join

假设我有表格中的数据(Sample.txt):

2 5 5 7 7 8 7 9 9 0 我使用过join -o 1.2 <(sort Sample.txt) <(sort first.txt) > second.txt first.txt只包含元素2(作为示例)。

这条指令的输出给了我5.我试图继续迭代获得更多的第2列元素,如:7因为5连接到7并继续迭代以获得8因为7连接到8.我是尝试将我的每个新的第2列元素放入第1列元素并提取相应的第2列元素,直到它为deadend。在这种情况下,继续到0,它会自动停止。目前我正在手动执行此操作,但挑战来自更大的数据。我得到了很多文本文件,下次迭代很难对它们进行排序。

我相信数组可用于存储中间结果,但我不熟悉使用数组。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

如果你想要执行与其设计完全不同的东西,我认为join不是一个很好的工具选择。以下简单的Awk脚本将遵循您描述的传递关系,并且不需要排序输入。

awk 'NR==FNR { a[$1]=$2; next }
    { n=$1; while (n in a) { print a[n]; n=a[n]; } }' Sample.txt first.txt

但是,这要求所有Sample.txt都可以适合内存。

如果您需要具有相同“from”值的多个“from to”对,则数据结构需要更复杂一些。也许是这样的:

awk 'NR==FNR { a[$1] = (a[$1] ? a[$1] "\n" $2 : $2); next }
    function emit (key) {
      if (key ~ /\n/) {
        split(key, k, /\n/);
        for (n in k) {
          emit(k[n])
        }
      } else if (key in a) { print a[key]; emit (a[key]) }
    }
    { emit($1) }' Sample.txt first.txt