【shell】awk按域去除重复行

时间:2023-03-08 15:41:34

首先解释一下什么叫“按域去除重复行”:

有的时候我们需要去除的重复行并不是整行都重复,两行的其中一列的元素相同我们有的时候就需要认定这两行重复,因此有了今天的内容。

去除重复行shell有一个原生命令但是不太好使应为这个命令找的重复行是上下文的重复行,也就是说需要提前排序,这样就增加了不必要的麻烦,我们在这里选择使用awk工具进行重复行的去除。

命令如下:

awk '!array[$0]++' Filename

解释一下这行代码,由于awk工作方式的特殊性,也就是按行读入按行输出,中间引号内的语句就是以[$0]为元素去map剩下的行,$0代表整行,把0换成数字就是行的index,!表示如果存在相同行就跳过,没有相同行才要输出,++是迭代过程。

另外,如果要将结果重定向到文件中,需要使用shell的文件O/I符号">"进行操作。

扩展:如果我们要找两个或者多个列相同的行怎么办?

在定义[]的时候我们可以如下写法:

awk '!array[$1,$2]++' Filename

这样就可以鉴别两列相同的行,多列亦如此。