AWK:确认连续行的匹配列



您好,感谢您抽出宝贵时间阅读这个问题。 在过去的一天里,我一直在试图解决问题,但还没有更接近解决方案。 我有一个包含以下内容的数据示例文件:

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}

相关内容

  • 没有找到相关文章