【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 : 显示不包含匹配文本的所有行。

posted @ 2022-05-04 22:17  哥们要飞  阅读(167)  评论(0)    收藏  举报