每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。
分类: LINUX
2011-05-14 14:31:56
结果:
[解析]
首先注意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进行赋值。在几千上万行的文本里执行效率会提高。