免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: useinxinuanihc
打印 上一主题 下一主题

如何用awk按组合关键字删除重复行 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2010-05-19 17:15 |只看该作者
使用awk '/..../ {print $10}' access_log |sort |uniq消重后的结果不彻底
因为$10有些是有时间戳的,如: ...
bbyyzhang 发表于 2010-05-19 15:25


搞定了
awk '/pattern/ {print substr($10,1,index($10,"?"))}' access_log |sort |uniq

论坛徽章:
0
32 [报告]
发表于 2010-05-19 20:37 |只看该作者
本帖最后由 dolphin1987 于 2010-05-19 20:45 编辑
  1. awk 'NR==FNR{a[$1]++} NR>FNR {if($2!=0||a[$1]==1) print $0}' test.txt  test.txt
复制代码
回复 2# blackold

牛人佩服
不过看了好一会儿才看懂,提一个小小的建议哈,
为了方便我们新人学习能不能写了代码之后,说一哈主要的思路。
或者把代码写得简单一点,能让我们新人有个学习的机会。呵呵
比如

论坛徽章:
0
33 [报告]
发表于 2010-05-20 16:29 |只看该作者
本帖最后由 linfengfeiye 于 2010-05-20 18:56 编辑

初学awk,练习一下。
  1. awk '{a[$0]=$0;if((b[$1]=$2)==0) b[$1]=$2; next} END {for (i in a) if ((b[substr(i,0,index(i," ")-1)]==0)||(substr(i,index(i," ")+1) !~/^[ ]+0$/)) print a[i]}' file1
复制代码
这个貌似是正确的。

论坛徽章:
0
34 [报告]
发表于 2010-05-20 21:24 |只看该作者

  1. sort -k1,1 -k2,2nr 数据文件 | awk '!(a[$1]++ && !$2)'

  2. 思路是把原文件按照第一字段、第二字段逆序的方式排序

  3. !(a[$1]++ && !$2) 的逻辑就是,排除 第一字段出现过且第二字段为0
复制代码

论坛徽章:
0
35 [报告]
发表于 2010-05-21 10:33 |只看该作者
本帖最后由 addictlinux 于 2010-05-23 21:47 编辑
  1. #!/bin/awk -f
  2. {if(NR==FNR){
  3.     a[$1]++;
  4.   }
  5.   else if(NR>FNR){
  6.      if(a[$1]==1)
  7.        print $0;
  8.      else if($2>0)
  9.        print $0;
  10.   }
  11. }
复制代码
./test01.awk file01 file01
写了才知道和别人的一样, 算了算赚个分吧.

论坛徽章:
0
36 [报告]
发表于 2010-05-21 10:38 |只看该作者
思路: step1,在第一文件中,查找第一域中,相同的有多少个a[$1]++;
        step2,在第二个文件中,如果第一域中,只有a[$1]==1 ,打印出来,否则打印 第二个域>0的。

论坛徽章:
0
37 [报告]
发表于 2010-05-21 14:01 |只看该作者
awk '{a[$0]=$1" 0";!a[$0]++}' file

论坛徽章:
0
38 [报告]
发表于 2010-05-21 14:02 |只看该作者
awk '{a[$0]=$1" 0";!a[$0]++}' file

论坛徽章:
0
39 [报告]
发表于 2010-05-21 16:28 |只看该作者
学习笔记
awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
     |--^--| |--^--| |-^| |-^-|  |-^-----| |--^-| ---^--
        |       |      |  | |      |          |      |_第2次读数据文件
        |       |      |  | |      |          |_第1次读数据文件
        |       |      |  | |      |_以第一个字段为下标的数组的值为1,
        |       |      |  | |        即本行的第一个字段的值在数据文件中
        |       |      |  | |        是唯一的,这时也执行打印数据的默认
        |       |      |  | |        操作
        |       |      |  | |_第2个字段的值不是0时执行打印数据的默认操作
        |       |      |  |-----^--------|
        |       |      |        |_此时NR!=FNR,即第2次读数据文件时,本判断
        |       |      |          才开始起起作用
        |       |      |_到下一行,本行记录后面的匹配都被忽略掉
        |       |_以第一个字段为下标的数组记录每一个第一个字段值相同的行
        |         数,例如第一个字段值为 PBCSPOFT0107 的记录行数为2,那么
        |         a[PBCSPOFT0107]的值就为2,第一个字段值为 PBCSPOFT0106
        |         的记录行数为1,那么a[PBCSPOFT0106]的值就为1.
        |_NR:awk开始执行程序后所读取的数据行数
          FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计

论坛徽章:
0
40 [报告]
发表于 2010-05-21 16:38 |只看该作者
urfile 文件如下
PBCSPOFT0101    0
PBCSPOFT0101    96
PBCSPOFT0102    0
PBCSPOFT0102    6
PBCSPOFT0103    0
PBCSPOFT0103    8
PBCSPOFT0104    0
PBCSPOFT0105    0
PBCSPOFT0106    0
PBCSPOFT0107    0
PBCSPOFT0107    10
PBCSPOFT0108    0

实现目的的awk语句分析如下
awk 'NR==FNR{a[$1]++;next}$2!=0||a[$1]==1' urfile urfile
     |--^--| |--^--| |-^| |-^-|  |-^-----| |--^-| ---^--
        |       |      |  | |      |          |      |_第2次读数据文件
        |       |      |  | |      |          |_第1次读数据文件
        |       |      |  | |      |_以第一个字段为下标的数组的值为1,
        |       |      |  | |        即本行的第一个字段的值在数据文件中
        |       |      |  | |        是唯一的,这时也执行打印数据的默认
        |       |      |  | |        操作
        |       |      |  | |_第2个字段的值不是0时执行打印数据的默认操作
        |       |      |  |-----^--------|
        |       |      |        |_此时NR!=FNR,即第2次读数据文件时,本判断
        |       |      |          才开始起起作用
        |       |      |_到下一行,本行记录后面的匹配都被忽略掉,这个很重
        |       |        要,因为没有的话后面的匹配会被执行。
        |       |_以第一个字段为下标的数组记录每一个第一个字段值相同的行
        |         数,例如第一个字段值为 PBCSPOFT0107 的记录行数为2,那么
        |         a[PBCSPOFT0107]的值就为2,第一个字段值为 PBCSPOFT0106
        |         的记录行数为1,那么a[PBCSPOFT0106]的值就为1.
        |_NR:awk开始执行程序后所读取的数据行数
          FNR:与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP