1. http://www.sina.com.cn

  2.  
  3. http://www.sina.com.cn
     

  4.  
  5. ################
     

  6.  
  7. http://www.163.com.cn
     

  8.  
  9. http://www.163.com.cn
     

  10.  
  11. ################
     

  12.  
  13. http://www.163.com
     

  14.  
  15. http://www.163.com
     

  16.  
  17. ################

 

结果:

  1. http://www.sina.com.cn
  2. ################
     
  3. http://www.163.com.cn
     
  4. ################
     
  5. http://www.163.com
     
  6. ################

 


 

 

 

  1. awk '$0!=v&&NF;NF{v=$0}' file

  2.  
  3. wk 'NF&&$0!=i{print;i=$0}' file

[解析]

 

  首先注意NF,它作为pattern是可以判断改行是否为空行的条件,这是个很经典的运用。

  $0不等于v,并且NF为真(即非零),第一行是满足条件的,这时候v是个空值,肯定是不等于$0的,并且第一行是有内容,NF为1,即为真,这里没有{action},在awk里没有{action}是默认打印该行,即写成 $0!=v&&NF{print $0} 也是一个含义。然后分号分割2个不同的命令,执行后面NF为真时把$0赋值给v,这时候NF是1,所以v的值就是第一行的文本内容。

  继续匹配第2行,NF为空,不满足条件,执行后面命令,NF也是为空,不满足条件,无任何动作,这时候v的值还是第一行内容,执行到第3行,$0的内容和v的值是一样的,不执行打印,NF为真,把第3行的内容赋值给v(和第一行内容一模一样)。一直执行到#号行,NF为真,并且v的值和$0不相等,打印该行,并且把该行的值赋给v,依次类推...得到了查重的效果。

  当然,做技术也要灵活运用举一反三,如果该文本没有空行,或者我们用 sed -i '/^$/d' file 来预先删除空行,然后执行 awk '$0!=v{print;v=$0}' file ,其实可以大大提高awk的处理效率,这时候不需要NF来作为pattern条件来判断空行了,只打印不重复的行,也无须一直对v进行赋值。在几千上万行的文本里执行效率会提高。