比较每行的多个列

时间:2017-12-14 01:36:08

标签: linux bash awk gawk

使用csv文件,我想比较多列以检查所有值是否相同。

第一行是标题 第一列是标签 对于我只放置8列的示例,常量值应该是从第2列到结尾(可以是100列)。

目的是检查所有值是否相同。如果不是,请报告

输入文件

Number,V2 1563,V03-1555,V4 - 294,V-05 1580,V6-1561,V7-1562,V05-1601,V9-1587
Code,4.1.06,4.1.03,4.1.06,4.1.06,4.1.06,4.1.06,4.1.06,4.1.06
Host Id,b90c27,b90c13,3.30E+65,b90c46,b90c21,b90c1f,b88a63,b90c49
SR,SR_2_MS,SR_2_MS,SR_4_MS,SR_2_MS,SR_2_MS,SR_2_MS,SR_2_MS,SR_2_MS

输出所需

Bad code in V03-1555
Bad SR in V4 - 294

感谢您的支持

1 个答案:

答案 0 :(得分:1)

awk救援!

我即兴创作了一点。我们怎么知道哪些值是正确的,哪些不是?流行投票,计算事件并假定多数是正确的。作为附带好处,如果所有值都与“主机ID”行中的不同,则不会报告任何内容

$ awk -F, 'NR==1 {split($0,h); next} 
                 {delete r; 
                  for(i=2;i<=NF;i++) {r[$i]++; idx[$i]=i}
                  max=0;
                  for(k in r) if(max<r[k]) max=r[k];
                  if(length(r)>1) 
                    for(k in r) 
                      if(r[k]!=max) 
                        print "Bad " $1 " in " h[idx[k]] " -> " k}' file

返回

Bad Code in V03-1555 -> 4.1.03
Bad SR in V4 - 294 -> SR_4_MS

您可以删除我打算验证的值。