awk ‘! a[$0]++’ 去重

awk ‘! a[$0]++’ 怎么理解?

这是一个非常经典的去重复项的awk语句,虽然短小,不过涉及到了不少知识点,下面一一解读:

<1> :”!” 即非。

<2>:a[$0],以$0为数据下标,建立数组a

<3>:a[$0]++,即给数组a赋值,a[$0]+=1

<4> :那么组合起来,awk是怎么执行!a[$0]++的呢?我用一个实际例子来解释:

cat file
111
222
111
222
333

awk ‘{print a[$0],!a[$0]++,a[$0],!a[$0],$0}‘ file
  1 1 0 111
  1 1 0 222
1 0 2 0 111
1 0 2 0 222
  1 1 0 333

  但pattern为1即为真时,执行action,此时action为空执行print $0

  由于执行了++,它的初值变成了0【执行++后数组被定义为int型,初始值就为0】

默认空char型变量未null,空int型变量为0

  第一次肯定是不同的行,所有不会有重复

  但遇到重复的行是,数组的下标相同,此时数组的value为0,执行++后,数组值为1,经取反后

  数组为0,action不执行【即不打印】

  

时间: 2024-10-07 11:48:35

awk ‘! a[$0]++’ 去重的相关文章

awk &#39;!arr[$0]++&#39;对文件进行处理

awk '!arr[$0]++'后跟文件,可以过滤掉重复的行. 如下面的文件经过处理. [[email protected] ~]# cat fstab # # /etc/fstab # /etc/fstab # /etc/fstab # /etc/fstab # /etc/fstab # Created by anaconda on Tue Jul 11 20:07:17 2017 # # Accessible filesystems, by reference, are maintained

awk去重以某列重复的行

[[email protected] cc]# cat 2.txt adc 3 5 a d aa 3 adfa d ba 3 adf 去重第一列重复的行: [[email protected] cc]# cat 2.txt |awk '!a[$1]++{print}'adc 3 5 a d a 重复的行取最上面一行记录 去重以第一列和第二列重复的行: [[email protected] cc]# cat 2.txt |awk '!a[$1" "$2]++{print}'adc 3 5

linux文本处理绝世好剑--awk

awk简介: awk的名称得自于它的创始人Aho, Weinberger, Kernighan三人的首字母. awk是一种数据处理工具,与"grep","sed"被称为linux文本处理三剑客,但相对于grep的查找,sed的编辑,awk擅长对数据分析并生成报告,是一种报告生成器,格式化文本输出,相对于sed常常作用于一整行的文本处理,awk则倾向于将一行分成数个"字段"来处理.因此awk更适合处理小型的数据. awk拥有自己的语言:awk程序设

grep、sed、awk基础

grep grep :根据模式,搜索文本,并将符合模式的文本行显示出来, 使用基本正则表达式定义的模式来过滤文本的命令: -i :忽略大小写 --color :加上颜色, -v :显示没有被模式匹配到的行 -n:显示匹配到的行在文件中的行数 -w:精确匹配,只匹配整个单词,而不是字符串的一部分 -o :只显示被模式匹配到的字符串 -A #:after, 后#行 -B #: before, 前#行 -C #:context, 前后各#行 -c:显示一个文件被匹配到几行 -E :使用扩展正则表达式

Linux Awk使用案例总结

知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序内部的一个表中,该表采用散列算法,因此数组元素是随机排序. 数组格式:array[index]=value 1.Nginx日志分析 日志格式:'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_

awk的用法

前言 awk是一个模式扫描及处理语言.既然是一门语言,那么它就拥有类似于其他编程语言.所以同学们,要学好awk,必须要有shell或其他语言的编程基础,如果你没有编程基础,那么先去建立吧. 基础语法 1.awk | -F field-separator| `cmd` input file awk -F : `cmd` input file 2.将awk命令插入一个文件,并使awk程序可以执行,然后用awk命令解释器作为脚本首行. 3.将所有awk命令插入一个单独文件   awk -f awk-s

shell数组和awk数组

awk终于能入门了,所以整理了该文章,内容大多来自网上. 一.bash支持一维数组(不支持多维数组),没有限定数组的大小.在shell中,用括号来表示数组,数组元素用空格符号分割开.类似于C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0 1. 定义数组 数组名array,元素a b c [[email protected]~]# array=(a b c) 2.获取所有元素 [[email protected]~]# echo ${a

整理的几个好一点的awk案例

一,有这么两个文本,要求以文本a的第一个字段为比较,如果文本b的第一个字段与a不符合,那么打印出该行. $ cat a1 a2 f3 54 8$ cat b1 a2 f3 55 8 这里用到FNR(记录当前处理文件的行数)  NR(记录当前处理的总行数) next(处理下一条记录,不行后边的action) awk默认执行的action print $0 awk 'NR==FNR{a[$1];next}!($1 in a)' a b 首先NR==FNR对文本a进行处理,把$1的值作为下标放入数组a

awk 部分 cut部分 &&网络部分复习

<<"com" shell file and  learn awk name        Chinese   Maths English wz           55       77      96       wzzx         66       66      69 sts          77       55      88 com awk '{print ($2+$3+$4)}' log  #  #0 #228 #201 #220  awk '{pr