当前位置: 首页 > 科技观察

如何使用Awk

时间:2023-03-16 12:04:14 科技观察

删除文件中的重复行了解如何使用awk的!visited[$0]++删除重复行而不重新排序或更改原始顺序。假设你有一个文本文件,你需要删除所有重复的行。TL;DR要保持原始顺序并删除重复行,请使用:awk'!visited[$0]++'your_file>deduplicated_file它是如何工作的这个脚本维护一个关联数组,该数组由文件中的重复数据删除行索引(键控),即每个索引对应的值是该行出现的次数。对于文件中的每一行,如果该行的(先前)出现次数为0,则该值递增1并打印该行,否则该值递增1且不打印该行。之前对awk不熟悉,想弄明白这么短的脚本是怎么实现的。我做了一些研究,结果如下:awk“脚本”!visited[$0]++在输入文件的每一行上执行。visited[]是关联数组(又名地图)类型的变量。awk会在第一次执行的时候初始化它,所以我们不需要初始化它。$0变量的值是当前正在处理的行的内容。visited[$0]使用等于$0的键(正在处理的行)访问此映射中的值,即出现次数(我们在下面设置)。!否定出现:在awk中,任何非零数字或任何非空字符串的计算结果为真。变量的默认初始值为空字符串,如果转换为数字则为0。也就是说:如果visited[$0]的值是一个大于0的数,取反后会被解释为false。如果visited[$0]的值是等于0的数字或空字符串,则取反并解析为true。++表示变量visited[$0]的值加1,如果值为空,awk会自动将其转为0(数字)并加1。注意:加1的操作是在我们获取到的值后进行的变量。一般来说,整个表达式的意思是:true:如果出现次数为0或空字符串false:如果出现次数大于0awk由一个模式或表达式以及与之关联的动作组成:{}如果模式匹配,将执行以下操作。如果省略该操作,awk将默认打印输入。省略的动作等同于{print$0}。我们的脚本由一个awk表达式语句组成,省略了操作。所以写:awk'!visited[$0]++'your_file>deduplicated_file等同于写:awk'!visited[$0]++{print$0}'your_file>deduplicated_file对于文件的每一行,如果表达式匹配,该行被打印到输出。否则,不执行任何操作并且不打印任何内容。为什么不使用uniq命令?uniq命令只能对相邻的行进行去重。下面是一个示例:$cattest.txtAAABBBAACCCBBA$uniqsorted_deduplicated_file使用cat+sort+cut上面的方法会产生一个去重文件,每行根据内容排序。将命令组合在一起可以解决这个问题。cat-n你的文件|排序-uk2|排序-nk1|cut-f2-工作原理假设我们有以下文件:abcghiabcdefxyzdefghiklmcat-ntest.txt在每行前面显示序列号:1abc2ghi3abc4def5xyz6def7ghi8klmsort-uk2根据第二列排序(k2选项)),只保留一次第二列相同的值(u选项):1abc4def2ghi8klm5xyzsort-nk1根据第一列排序(k1选项),将列值当作数字来处理(-n选项):1abc2ghi4def5xyz8klm最后,cut-f2-打印从第二列开始的每一行,直到最后一个内容(-f2-选项:注意-后缀,表示包括该行之后的内容)。abcghidefxyzklm参考GNUawk用户手册awk中的数组Awk—真值Awk表达式Unix如何删除文件中的重复行?去除重复行不排序(去重)'!a[$0]++'works以上为全文。