当前位置: > shell编程 >

Shell实战:检查是否有重复,并提取重复内容

时间:2014-04-29 01:42来源:linux.it.net.cn 作者:IT网
检查文件下第二列是否有重复,且有几行是重复的,并提取出重复的行的第二列
实际工作中是上百万行,列也比这多,这里只是列出一小部分而已,具体如下:cnyunwei.log
0920762613004   367707175433      0635
0921702423002   508705309115      1035
0922450613006   328209142523      5063
0927310523001   518207014922      1035
0920910523002   538510242124      6035
0920910613004   538311101228      1035
0921980613015   327806305726      1635
0922262313001   458706080015      1033
0920012313004   518306272410      9065
0926470213015   518207014922      5635
0925112313002   138512110026      1035
0928030613003   128601150031      1357
0927340123001   538311101228      1035
0926471413002   518803249270      8065
0926550523002   448706043468      1035
200908565489    148705080622      2083
200910633424    427703083341      1183
709101202008    138512110026      1035
0933001263450   337904124727      4258
709108057002    13801126122X      1335
709200077043    338905250343      1035
0933001251479   138512110026      5258
709213077016    338912128329      1035
709213072032    338612152326      1335
709213072002    338705158523      1935
709214077003    339001015682      1035
==>> 以下两种方法可以达到同样的效果
awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | grep -v "1 "
awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}'
执行后的结果:
2 538311101228
2 518207014922
3 138512110026
注:
awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c
==>> 意思是提取出第二列并过滤重复,且列出重复行数
扩展一下,把以上结果所在行整行内容取出==>> 把上面取出的结果临时存于temp.log文件中,再读取这个文件来取原文件里的整行内容

awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | grep -v "1 " | awk '{print $2}' >> temp.log

awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}' | awk '{print $2}' >> temp.log
==>>
vi cnyunwei.sh
#!/bin/sh
SOCFILENAME=cnyunwei.log
FILENAME=temp.log

if [ -e $FILENAME ]; then
rm -rf $FILENAME
fi
awk -F " " '{print $2}' $SOCFILENAME | sort -r | uniq -c | grep -v "1 " | awk '{print $2}' >> $FILENAME

while read LINE
do
  grep $LINE $SOCFILENAME
done < $FILENAME
exit 0
更简单的方法合并成一行命令搞定:
awk -F " " '{print $2}' cnyunwei.log | sort -r | uniq -c | awk '{if($1>1){print $0}}' | awk '{print $2}' | while read output;do grep $output cnyunwei.log; done
都是工作中的实战Shell,大家回帖补充完善! (责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容