怎样使用 awk 删掉文件中重复的行

怎样使用 awk 删掉文件中重复的行

假定你有一个文本文件,你须要删掉一切重复的行。

TL;DR

要坚持本来的摆放次序删掉重复行,运用:

awk'!visited[$0]++'your_filededuplicated_file
作业原理

这个脚本保护一个相关数组,索引(键)为文件中去重后的行,每个索引对应的值为该行呈现的次数。关于文件的每一行,假如这行(之前)呈现的次数为则值加并打印这行,不然值加不打印这行。

我之前不熟悉awk,我想弄清楚这么矮小的一个脚本是怎样完成的。我调研了下,下面是调研心得:

这个awk“脚本”!visited[$0]++对输入文件的每一行都履行。

visited[]是一个相关数组(又叫映射)类型的变量。awk会在榜首次履行时初始化它,因而咱们不须要初始化。

$0变量的值是当时正在被处理的行的内容。

visited[$0]经过与$0(正在被处理的行)持平的键来访问该映射中的值,即呈现次数(咱们在下面设置的)。

!对表明呈现次数的值取反:在awk中,恣意非零的数或恣意非空的字符串的值是true。变量默许的初始值为空字符串,假如被转换为数字,则为0。也就是说:假如visited[$0]的值是一个比0大的数,取反后被解析成false。假如visited[$0]的值为等于0的数字或空字符串,取反后被解析成true。++表明变量visited[$0]的值加1。假如该值为空,awk主动把它转换为0(数字)后加1。留心:加1操作是在咱们取到了变量的值之后履行的。

总的来说,整个表达式的意思是:

true:假如表明呈现次数为0或空字符串

false:假如呈现的次数大于0

awk由形式或表达式和一个与之相关的动作组成:

形式/表达式{动作}

假如匹配到了形式,就会履行后边的动作。假如省掉动作,awk默许会打印(print)输入。

咱们的脚本由一个awk表达式句子组成,省掉了动作。因而这样写:

awk'!visited[$0]++'your_filededuplicated_file

等于这样写:

awk'!visited[$0]++{print$0}'your_filededuplicated_file

关于文件的每一行,假如表达式匹配到了,这行内容被打印到输出。不然,不履行动作,不打印任何东西。

为什么不必uniq指令?

uniq指令仅能对相邻的行去重。这是一个示例:

$$
其他办法运用sort指令

咱们也能够用下面的sort指令来去除重复的行,可是本来的行次序没有被保存。

sort-uyour_filesorted_deduplicated_file
运用cat+sort+cut

上面的办法会产出一个去重的文件,各行是根据内容进行排序的。经过管道衔接指令能够处理这个问题。

cat-nyour_file|sort-uk2|sort-nk1|cut-f

作业原理

假定咱们有下面一个文件:

abcghiabcdefxyzdefghiklm

在每行前面显现序号:

1abc2ghi3abc4def5xyz6def7ghi8klm

sort-uk2根据第二列(k2选项)进行排序,关于第二列相同的值只保存一次(u选项):

1abc4def2ghi8klm5xyz

sort-nk1根据榜首列排序(k1选项),把列的值作为数字来处理(-n选项):

1abc2ghi4def5xyz8klm

最终,cut-f从第二列开端打印每一行,直到最终的内容(-f选项:留心-后缀,它表明这行后边的内容都包括在内)。

abcghidefxyzklm
参阅

GNUawk用户手册

awk中的数组

Awk—真值

Awk表达式

Unix怎样删去文件中重复的行?

不必排序去掉重复的行(去重)

‘!a[$0]++’作业原理

以上为全文。

via:

作者:LazarusLazaridis选题:lujun9972译者:lxbwolf校正:wxy

本文由LCTT原创编译,Linux我国荣誉推出

发布于 2024-03-21 12:23
255
上一篇:linux清理磁盘空间,需要注意 下一篇:周易科普馆:为什么说算命和算卦,实际上是两种不同的技法?
目录

    推荐阅读