首页 > 代码库 > awk知识点

awk知识点

awk中删除重复行(转)

1.去除部分字段重复的行

sort+uniq也可以完成,但是awk真的很强大。两者的差异还在于,awk保持了文件中原本的每行的顺序,而sort必须排序,这样就变成按字母或某种其他规则的排序了。

less num.list |awk ‘$1~/84[0-9]/‘|awk ‘!a[$1]++‘

2.去除记录重复的行  awk去除重复行,思路是以每一行的$0为key,创建一个hash数组,后续碰到的行,如果数组里已经有了,就不再print了,否则将其print

在awk中,可以用!a[$0]++做为条件,对重复出现的行进行处理。

1.如果仅仅是删除内容完全一样的重复行
则可以使用sort先进行排序 然后使用 uniq进行删除重复数据即可,uniq 去除重复(必须先进行排序,否则uniq无法去除重复 uniq 是比较前后两行的数据,如果相邻两行数据不同则认为数据不同)
sort CUST.TXT | uniq > Target.TXT

2.根据指定列进行去除重复行

这里的重复是指如果两行的某一列数据相同,则认为是重复数据,现在我们如何去除列相同的重复项
第一步:sort进行排序
第二步:用awk对相邻两行数据进行比较如果第一列的数据相同则去除重复行(保留第一个相同的行)
这里的去除重复行并不是真正的删除重复行而是利用unix shell管道对重复行的不进行重定向输出
    sort -t,-k1 CUST.TXT | awk -F, ‘   
    $1 == CUST_ID {   
    }  
    $1 != CUST_ID {  
      CUST_ID = $1;  
      print $0;  
    }‘ > Target.TXT  
sort -t, -k1   
-t,指定文件记录域分隔符为","  
-k1是指根据第1列进行排序
-F, 指定域分隔符为","
$1 == CUST_ID 判断 第一列是否与变量 CUST_ID相等(不必要担心CUST_ID变量的值在初始化时awk为CUST_ID 赋值为""),如果相等什么多不做
$1 != CUST_ID { CUST_ID = $1 ;print $0;}如果一列不等于 CUST_ID 变量的值将$1赋值为 CUST_ID
然后打印这行数据,然后进行下一行比较下一行数据与上一行数据的CUST_ID 是否相等 相等 什么都不做,也就是说不打印这一行 如果不相等则打印这一行从而起到去除重复数据的作用

awk中RS,ORS,FS,OFS区别与联系(转)

awk文件合并方法(转载)

  

awk知识点