如何通过unix中的数据来validation组的数量

我有一个logging列表如下

资源:

a,yes a,yes b,No c,N/A c,N/A c,N/A d,xyz d,abc d,abc 

输出:

 a, Yes 2 b, No 1 c, N/A 3 d, xyz 1 d, abc 2 c, N/A "File is not correct" 

这里的“是”和“否”是可以接受的单词,如果其他的单词数大于单个$ 1值的“是”或“否”字数,那么我们发出一个类似“文件不好”

我已经尝试了下面的脚本

 awk -F, '{a[$1]++;}END{for (i in a)print i, a[i];}' filetest.txt 

Solutions Collecting From Web of "如何通过unix中的数据来validation组的数量"

如果您不担心输出序列(与Input_file相同),那么以下内容可能会对您有所帮助。

 awk -F, '{array[$1", "$2]++;} /yes/{y++;next} /No/{n++;next} /N\/A/{count++;next} END{;for(i in array){printf("%s %s%s\n",i,array[i],(count>y && count>n) && i ~ /N\/A/?RS i" File is not correct":"")}}' Input_file 

编辑:现在也添加一个非线性形式的解决方案。

 awk -F, '{ array[$1", "$2]++; } /yes/{ y++; next } /No/{ n++; next } /N\/A/{ count++; next } END{; for(i in array){ printf("%s %s%s\n",i,array[i],(count>y && count>n) && i ~ /N\/A/?RS i" File is not correct":"") } }' Input_file 

编辑2:按照OP N / A不应该硬编码,那么下面的代码将检查字符串的计数是,字符串的计数和第二个字段的其余部分的计数。 然后比较休息次数是和否,根据OP的要求打印行数。

 awk -F, '{ array[$1", "$2]++; } /yes/{ y++; next } /No/{ n++; next } { count[$2]++; } END{ for(i in count){ val=val>count[i]?val:count[i] }; for(i in array){ printf("%s %s%s\n",i,array[i],(val>y && val>n) &&(i !~ /yes/ && i !~ /No/)?RS i" File is not correct":"") } }' Input_file 

运行上面的代码后,我越来越关注。

 ./script.ksh d, xyz 1 d, xyz File is not correct c, N/A 3 c, N/A File is not correct b, No 1 a, yes 2 d, abc 2 d, abc File is not correct 

GNU awk用于真正的多维数组:

 $ cat tst.awk BEGIN { FS=","; OFS=", " } { cnt[$1][$2]++ } END { for (key in cnt) { for (val in cnt[key]) { cur = cnt[key][val] print key, val " " cur if (tolower(val) ~ /^(yes|no)$/) { maxGood = (maxGood > cur ? maxGood : cur) } else { badCnt[key][val] = cur } } } print "" for (key in badCnt) { for (val in badCnt[key]) { if (badCnt[key][val] > maxGood) { print key, val " File is not correct" } } } } $ awk -f tst.awk file a, yes 2 b, No 1 c, N/A 3 d, abc 2 d, xyz 1 c, N/A File is not correct 

在其他地方使用tolower() ,或者如果你的$ 2数据真的可以是大写或小写,或者如果这只是你的例子中的一个错误,并且取决于你是否希望那被视为一个错误。

输出将以随机的顺序in运营商礼貌 – 这很容易改变到任何其他顺序,如果你在意。

 #!/bin/sh FILE=1.txt for r in `cat $FILE | sort | uniq`; do count=`grep "$r" "$FILE" | wc -l | sed -e 's/^ *//'` echo "$r $count"; done