linux&Perl&R  

sed与awk去除重复行

1 如果仅仅是删除内容完全一样重复行 

则可以使用sort先进行排序 然后使用 uniq进行删除重复数据即可

例如  CUST.TXT

Txt代码 

  1. 130000006800,17,151,01,250100  

  2. 130000006800,17,151,01,250101  

  3. 1300001077,17,151,01,256600  

  4. 1300002764,17,151,01,256600  

  5. 1300002764,17,151,01,256630  

  6. 1300003690,17,151,01,256600  

  7. 1300001077,17,151,01,256600  

  8. 1300004771,17,151,01256600  

  9. 1300006064,17,151,01,251900  

  10. 130000693300,17,151,01370102690715295  

  11. 1300013082,17,151,01,51700  

 

 第3行与第7行完全相同

 第一步:sort 进行排序

第二部: uniq 去除重复(必须先进行排序,否则uniq无法去除重复 uniq 是比较前后两行的数据,如果相邻两行数据不同则认为数据不同)

 

Shell代码 

  1. sort CUST.TXT | uniq > Target.TXT  

 

 查看Target.TXT

 

Txt代码 

  1. 130000006800,17,151,01,250100  

  2. 130000006800,17,151,01,250101  

  3. 1300001077,17,151,01,256600  

  4. 1300002764,17,151,01,256600  

  5. 1300002764,17,151,01,256630  

  6. 1300003690,17,151,01,256600  

  7. 1300004771,17,151,01256600  

  8. 1300006064,17,151,01,251900  

  9. 130000693300,17,151,01370102690715295  

  10. 1300013082,17,151,01,51700  

 发现 1300001077,17,151,01,256600 这条记录只有一条了

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

 这里的重复是指如果两行的某一列数据相同,则认为是重复数据

例如第1行与第2行数据根据域分隔符","分割的第一列(CUST_ID)

第4行与第5行数据也是CUST_ID 相同 现在我们如何去除列相同的重复项

第一步: sort 进行排序

第二步: 用awk对相邻两行数据进行比较如果第一列的数据相同则去除重复行(保留第一个相同的行,)

 这里的去除重复行 并不是真正的删除重复行而是 利用unix shell 管道 对重复行的不进行重定向输出

 

Shell代码 

  1. sort -t, -k1 CUST.TXT | awk -F, '  

  2. {  

  3. $1 == CUST_ID {  

  4.   

  5. }  

  6. $1 != CUST_ID {  

  7.   CUST_ID = $1;  

  8.   print $0;  

  9. }' > Target.TXT  

 运行结果如下:

 

Txt代码 

  1. 130000006800,17,151,01,250100  

  2. 1300001077,17,151,01,256600  

  3. 1300002764,17,151,01,256600  

  4. 1300003690,17,151,01,256600  

  5. 1300004771,17,151,01256600  

  6. 1300006064,17,151,01,251900  

  7. 130000693300,17,151,01370102690715295  

  8. 1300013082,17,151,01,51700  

 语法解释:

  sort -t, -k1   

 -t,   指定文件记录域分隔符为","  

 -k1  是指根据第1列进行排序

 

awk -F, ' {

 $1 == CUST_ID {

 }

 $1 != CUST_ID {

  CUST_ID = $1;

  print $0;

 } ' > Target.TXT

 

 -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 是否相等 相等 什么都不敢 也就是说

不打印着一行 如果不相等则打印着一行 从而起到去除重复数据的作用


via http://butterflymacro.iteye.com/blog/846540

2013-04-17 热度-2 sedawk

评论

热度(2)

©linux&Perl&R Powered by LOFTER