【Shell案例】【awk、grep、sort、uniq】10、第二列是否有重复
给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个shell脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:
实例:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97
结果:
2 java
3 go
思路:
awk+循环+找第二列计数+打印大于1的值和对应元素
自己写的【错误】
#!/bin/bash awk '{for(i=1;i<=NF;i++){ arr[$2]++ }}END{ for(int j=1;i<=NF;j++){ if(arr[j]!=1){ print arr[j] $j } } }' nowcoder.txt
方法1:awk文本分析工具
#!/bin/bash awk '{a[$2]++} END{for(i in a) {if(a[i]>=2){print a[i]" "i}}}' nowcoder.txt
或写成
#!/bin/bash awk '{a[$2]++} END{for(i in a) {if(a[i]>=2){print a[i],i}}}' nowcoder.txt
方法2:管道
awk ' { freqs[$2] += 1 } END { for (x in freqs) { print(freqs[x], x) } } ' nowcoder.txt | awk ' { if ($1 > 1) { print($0) } } '
方法3:sort+去重+查找
#!/bin/bash cat nowcoder.txt|awk '{print $2}'|sort|uniq -c|grep -v '1'|sort -n
sort -n 依照数值的大小排序。
sort 默认的方式将文本文件的第一列以 ASCII 码的次序排列,并将结果输出到标准输出。
uniq -c或--count 在每列旁边显示该行重复出现的次数。【去重的同时,显示重复出现的次数】
3 test 30 #前面的数字的意义为该行共出现了3次
grep -v 或 --invert-match : 显示不包含匹配文本的所有行。
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/16222689.html

浙公网安备 33010602011771号