假设我有表格中的数据(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,它会自动停止。目前我正在手动执行此操作,但挑战来自更大的数据。我得到了很多文本文件,下次迭代很难对它们进行排序。
我相信数组可用于存储中间结果,但我不熟悉使用数组。有人可以帮助我吗?
答案 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