您好,感谢您抽出宝贵时间阅读这个问题。 在过去的一天里,我一直在试图解决问题,但还没有更接近解决方案。 我有一个包含以下内容的数据示例文件:
Fighter@Trainer
Bobby@SamBonen
Billy@BobBrown
Sammy@DJacobson
James@DJacobson
Donny@SonnyG
Ben@JasonS
Dave@JuanO
Derrek@KMcLaughlin
Dillon@LGarmati
Orson@LGarmati
Jeff@RodgerU
Brad@VCastillo
目标是确定拥有多个战斗机的"训练师"。 我的直觉是需要AWK中的"getline"和可变声明指令。 我尝试了不同的组合
awk -F@ 'NR>1{a=$2; getline; if($2 = a) {print $0,"Yes"} else {print $0,"NO"}}' sample.txt
然而,输出远未达到预期的结果。 事实上,它甚至没有输出示例文件中的所有行!
我想要的结果是:
Fighter@Trainer
Bobby@SamBonen@NO
Billy@BobBrown@NO
Sammy@DJacobson@YES
James@DJacobson@YES
Donny@SonnyG@NO
Ben@JasonS@NO
Dave@JuanO@NO
Derrek@KMcLaughlin@NO
Dillon@LGarmati@YES
Orson@LGarmati@YES
Jeff@RodgerU@NO
Brad@VCastillo@NO
我完全不知道该何去何从。 我一直在寻找并试图找到无济于事的解决方案,我正在寻找一些输入。 谢谢!
你不需要getline
.您可以正常处理输入,建立每个培训师的计数,并将结果打印在END
块中:
awk -F@ '{
lines[NR] = $0;
trainers[NR] = $2;
counts[$2]++;
}
END {
print lines[1];
for (i = 2; i <= length(lines); i++) {
print lines[i] "@" (counts[trainers[i]] > 1 ? "YES" : "NO");
}
}' sample.txt
另一种选择是进行两次传递:
$ cat p.awk
BEGIN {FS=OFS="@"}
NR==1 {print;next};
NR==FNR {++trainers[$2]; next}
FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print}
$ awk -f p.awk p.txt p.txt
Fighter@Trainer
Bobby@SamBonen@NO
Billy@BobBrown@NO
Sammy@DJacobson@YES
James@DJacobson@YES
Donny@SonnyG@NO
Ben@JasonS@NO
Dave@JuanO@NO
Derrek@KMcLaughlin@NO
Dillon@LGarmati@YES
Orson@LGarmati@YES
Jeff@RodgerU@NO
Brad@VCastillo@NO
解释:
设置输入和输出文件分隔符:
BEGIN {FS=OFS="@"}
打印页眉:
NR==1 {print;next};
第一次通过,计算每个训练师的出现次数:
NR==FNR {++trainers[$2]; next}
第二遍,根据培训师数量设置"是"或"否",打印结果:
FNR>1 {$3=(trainers[$2]>1)?"YES":"NO"; print}