我一直致力于一项简短的任务,以确定数据库中的死锁。为此,我将定期监视进程详细信息,一旦我将其转储到文本文件。
经过一定的操作后要监视的输出文件(微缩版)是:
输入文件: -
SPID BLOCKING SPID
23 50
71 46
50 60
60 96
这意味着过程23被过程50阻止,进而被60阻止。 因此,在这种情况下,过程链依赖性是23-> 50-> 60-> 96而另一个71-> 46 总之,我想要最终的罪魁祸首..在这种情况下96和46以及链数(4和2)
输出文件: -
CULPRIT SPID CHAIN_COUNT
1) 96 4
2) 46 2
为此,整个文件必须循环并比较第2列与文件中的任何第1列匹配。必须重复这一过程,直到第2列不匹配为止
我需要通过awk或sed来实现这一点,但我相信这可以通过链接来实现 列表。
任何类型的建议都是欢迎的
**** JS还有一个问题,对于样本文件
SPID BLOCKING SPID
45 11
12 34
34 35
23 60
71 45
60 71
OUTPUT I RECEIVE:
71=>45
23=>60->71
12=>34->35
OUTPUT I AM SUPPOSED TO GET
23=>60=>71=>45
12=>34->35
我希望你得到我想说的话。
答案 0 :(得分:2)
让我们尝试分两步解决这个问题。第一步是我们将使用您的输入文件创建链(假设您可以返回并检查跟踪):
awk '
NR>1 {
for(value in values) {
if ($1 == values[value]) {
chain[$1] = chain[value] "->" $2;
values[$1] = $2;
delete chain[value];
delete values[value];
next
}
}
values[$1] = $2;
chain[$1] = $1 "->" $2
}
END {
for(left in values) {
for(c in chain) {
x = split(chain[c],t,/->/)
if (left == t[x]) {
chain[left] = chain[c] "->" values[left]
delete chain[c]
values[left]
}
}
}
for (trail in chain) print chain[trail]
}' file
对于您的输入文件,这将输出为:
23->60->71->45->11
12->34->35
现在我们将上面的脚本传递给另一个awk
进行格式化。
awk -F'->' '
BEGIN {
OFS="\t";
print "CULPRIT SPID", "CHAIN_COUNT"
}
{
print $NF, NF
}'
这将输出为:
CULPRIT SPID CHAIN_COUNT
11 5
35 3
正如我之前所说的那样假设您需要查看路径。如果跟踪对您没用,那么您可以简单地执行以下操作:
awk '
BEGIN {
OFS="\t";
print "CULPRIT SPID", "CHAIN_COUNT"
}
NR>1 {
for(value in values) {
if ($1 == values[value]) {
chain[$1] = chain[value] FS $2;
values[$1] = $2;
delete chain[value];
next
}
}
values[$1] = $2;
chain[$1] = $1 FS $2
}
END {
for(left in values) {
for(c in chain) {
x = split (chain[c],t)
if (left == t[x]) {
chain[left] = chain[c] FS values[left]
delete chain[c]
values[left]
}
}
}
for(v in chain) {
num = split(chain[v], culprit)
print culprit[num], num
}
}' file
输出将是:
CULPRIT SPID CHAIN_COUNT
11 5
35 3
您可以根据需要将其重定向到输出文件。