`

Linux awk 按行内容去重

阅读更多
awk 介绍

1. 先上例子
cat  test.log  |sort  |awk '
BEGIN{m="";}
{ if(m=="" || m!=$1){m=$1; print $1;} }
' |wc -l
 
2. 解释例子
    2.1 cat       查阅test.log内容
    2.2 |sort     对test.log的内容进行排序
    2.3 |awk '...'    执行awk去重(稍后详述)
    2.4 |wc -l   统计结果行数
    2.5 BEGIN{m="";} 初始化代码块; 声明了变量m为空值。
    2.6 { if(m=="" || m!=$1){m=$1; print $1;} }
          {}称为执行体。
           如果m为空或者m不等于当前行的值,则把当前行的值给m,然后输出当前行。
           由于是排序的,所以下一行跟上一行比较,自然达到了去重的效果。

3. 模块解释
    BEGIN模块
    BEGIN模块后紧跟着动作块,这个动作块在awk处理任何输入文件之前执行。所以它可以在没有任何输入的情况下进行测试。它通常用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk 'BEGIN{print "TITLE TEST"}只打印标题。 
 
    END模块
    END不匹配任何的输入文件,但是执行动作块中的所有动作,它在整个输入文件处理完成后被执行。如$ awk 'END{print "The number of records is" NR}' test,上式将打印所有被处理的记录数。

参阅资料:


分享到:
评论
2 楼 lionbule 2012-06-01  
thebye85 写道
这个地方也可以用uniq

thx
1 楼 thebye85 2012-05-16  
这个地方也可以用uniq

相关推荐

Global site tag (gtag.js) - Google Analytics