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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值