bash,遍历到同一个文件以查找child

bash,遍历到同一个文件以查找child,bash,loops,awk,sed,associative-array,Bash,Loops,Awk,Sed,Associative Array,我有以下格式的数据 1234|4568 4568|abcd abcd|0987 pqrs|1111 0987|2222 lmno|xyza 预期产量为 1234|2222 pqrs|1111 lmno|xyza 每个记录的匹配方式查找其子项和子项并与父项一起获取最低的子项 说 因此,这些条目所需的输出是 a|d 也可能发生 a|b b|a 其中,a | a将是输出 我在琢磨如何才能做到这一点?[花了几个小时思考如何做到这一点?] 我可以在AWK中使用关联数组吗?不是完整的解决方案,但也许

我有以下格式的数据

1234|4568
4568|abcd
abcd|0987
pqrs|1111
0987|2222
lmno|xyza
预期产量为

1234|2222
pqrs|1111
lmno|xyza
每个记录的匹配方式查找其子项和子项并与父项一起获取最低的子项

因此,这些条目所需的输出是

a|d
也可能发生

a|b
b|a
其中,
a | a
将是输出

我在琢磨如何才能做到这一点?[花了几个小时思考如何做到这一点?]
我可以在AWK中使用关联数组吗?

不是完整的解决方案,但也许可以让您开始

$ awk -F"|" '{a[$1]=$2} 
          END{for(i in a) 
                {k=a[i]; 
                 printf i"/"k; 
                 while (k in a) {k=a[k]; printf "/"k}
                 print ""
                }
             }' file
abcd/0987/2222
4568/abcd/0987/2222
1234/4568/abcd/0987/2222
0987/2222
lmno/xyza
pqrs/1111

我会给你路径。您需要消除较短的子序列并添加循环检测。

不是完整的解决方案,但可能会让您开始

$ awk -F"|" '{a[$1]=$2} 
          END{for(i in a) 
                {k=a[i]; 
                 printf i"/"k; 
                 while (k in a) {k=a[k]; printf "/"k}
                 print ""
                }
             }' file
abcd/0987/2222
4568/abcd/0987/2222
1234/4568/abcd/0987/2222
0987/2222
lmno/xyza
pqrs/1111

我会给你路径。您需要消除较短的子序列并添加循环检测。

这一行程序满足您的要求:

awk -F'|' -v OFS='|' '{for(x in a)if(a[x]==$1){a[x]=$2;next}a[$1]=$2}
                       END{for(x in a)print x, a[x]}' file
用您的示例进行测试:

kent$  cat f
1234|4568
4568|abcd
abcd|0987
pqrs|1111
0987|2222
lmno|xyza

kent$  awk -F'|' -v OFS='|' '{for(x in a)if(a[x]==$1){a[x]=$2;next}a[$1]=$2}END{for(x in a)print x, a[x]}' f
lmno|xyza
pqrs|1111
1234|2222

这一行可以满足您的需求:

awk -F'|' -v OFS='|' '{for(x in a)if(a[x]==$1){a[x]=$2;next}a[$1]=$2}
                       END{for(x in a)print x, a[x]}' file
用您的示例进行测试:

kent$  cat f
1234|4568
4568|abcd
abcd|0987
pqrs|1111
0987|2222
lmno|xyza

kent$  awk -F'|' -v OFS='|' '{for(x in a)if(a[x]==$1){a[x]=$2;next}a[$1]=$2}END{for(x in a)print x, a[x]}' f
lmno|xyza
pqrs|1111
1234|2222
这可能适用于您(GNU-sed):

这会将文件拖到内存中,并反复使用模式匹配和替换,直到不再出现进一步的匹配。

这可能适用于您(GNU-sed):


这会将文件拖到内存中,并反复使用模式匹配和替换,直到不再出现进一步的匹配。

我生成了一个大文件并尝试了这两种方法。您的方法是消耗更多的CPU和更少的内存&Karakfa方法消耗更少的CPU和更多的内存。两者都解决了我的问题。ThanksI生成了一个大文件并尝试了两种方法。您的方法是消耗更多的CPU和更少的内存&Karakfa方法消耗更少的CPU和更多的内存。两个都解决了我的案子。谢谢