如何用awk判断文件第二列值是否全部相同并输出指定结果
解决awk判断文件第二列是否全相同的问题
嘿,我来帮你修正这个awk脚本,实现你想要的功能!
你的需求很明确:检查文件第二列的所有值是否一致,一致输出2835: OK,不一致则输出2835: BAD。咱们先看看你原来代码的问题,再给出正确的实现。
你原有代码的问题
你写的:
awk '{a[$2]++} END { for (n in a ) print $0 " " n, a[n]}' file
这段代码是在统计第二列每个值的出现次数,但存在两个关键问题:
END块里的$0是最后一行的内容(也就是输入里的2835: OK),所以输出会带上这个无关内容- 没有做“是否所有值一致”的判断,只是输出了统计结果,完全不符合你要的最终输出格式
正确的awk实现
这里给你两种方案,都能满足需求:
方案1:遍历所有行判断(适合小文件)
awk 'NR==1 {val=$2} $2!=val {flag=1} END {print "2835: " (flag ? "BAD" : "OK")}' file
代码解释:
NR==1 {val=$2}:读取第一行时,把第二列的值存到val变量里作为基准$2!=val {flag=1}:只要发现某一行的第二列和基准值不同,就把flag设为1(标记存在差异)END块:根据flag的值输出结果——如果flag为1(有差异)就输出2835: BAD,否则输出2835: OK
方案2:提前退出(适合大文件,更高效)
如果文件很大,我们不需要遍历完所有行,只要发现第一个不同值就可以直接输出结果并退出:
awk 'NR==1 {val=$2; next} $2!=val {print "2835: BAD"; exit} END {print "2835: OK"}' file
代码解释:
NR==1 {val=$2; next}:第一行存好基准值后,用next跳过后续处理,直接进入下一行$2!=val {print "2835: BAD"; exit}:只要发现某一行第二列和基准不同,立刻输出BAD并退出脚本,不用处理剩下的行END块:如果所有行都处理完没触发退出,说明第二列全相同,输出OK
测试你的输入文件
用你的输入内容测试这两个脚本,都会输出:
2835: BAD
完全符合你的期望!
内容的提问来源于stack exchange,提问作者OXXO
相关产品推荐
相关产品推荐

