使用 awk 语言从包含函数 ID 的 txt 文件构建函数调用图
Using awk language for constructing a function call graph from a txt file containing function IDs
我有一个包含两列的 txt 文件,在每一列中我都有函数 ID,指示第一个函数调用第二个函数,如下所示:
1,4
12,5
4,8
8,1
5,23
现在,我将使用 awk 命令查找我的函数调用流程。例如,根据我文件的上述内容,我想提取一个流1,4,8和12,5,23
对于每个流程,我将继续添加函数 ID,直到到达一个圆圈或到达文件末尾。
我的文件非常大,我不想使用 python。
您需要一个递归下降程序,如下所示:
$ cat recurse.awk
BEGIN { FS=OFS="," }
{
roots[NR] =
map[] =
}
END {
for (rootNr=1; rootNr<=NR; rootNr++) {
root = roots[rootNr]
if ( !(seen[root]++) ) {
tree = root
descend(root)
print tree
}
}
}
function descend(root, branch) {
if (root in map) {
branch = map[root]
if ( !(seen[branch]++) ) {
tree = tree OFS branch
descend(branch)
}
}
}
$ awk -f recurse.awk file
1,4,8
12,5,23
我有一个包含两列的 txt 文件,在每一列中我都有函数 ID,指示第一个函数调用第二个函数,如下所示:
1,4
12,5
4,8
8,1
5,23
现在,我将使用 awk 命令查找我的函数调用流程。例如,根据我文件的上述内容,我想提取一个流1,4,8和12,5,23
对于每个流程,我将继续添加函数 ID,直到到达一个圆圈或到达文件末尾。 我的文件非常大,我不想使用 python。
您需要一个递归下降程序,如下所示:
$ cat recurse.awk
BEGIN { FS=OFS="," }
{
roots[NR] =
map[] =
}
END {
for (rootNr=1; rootNr<=NR; rootNr++) {
root = roots[rootNr]
if ( !(seen[root]++) ) {
tree = root
descend(root)
print tree
}
}
}
function descend(root, branch) {
if (root in map) {
branch = map[root]
if ( !(seen[branch]++) ) {
tree = tree OFS branch
descend(branch)
}
}
}
$ awk -f recurse.awk file
1,4,8
12,5,23