是一个AWK新手,使用移植到Windows(GNXUtils)和gawk而不是awk的GNU实用程序.这个论坛上的解决方案就像绝对的魔术一样,我试图找到一个我可以阅读的来源,以更好地理解该解决方案中提供的模式表达.
在UNIX shell脚本中从列表中选择唯一值或不同值时, Dimitre Radoulov的答案提供以下代码
zsh-4.3.9[t]% awk '!_[$0]++' file
Run Code Online (Sandbox Code Playgroud)
作为选择具有重复和混杂元素的列表元素的解决方案,仅列出每个元素一次.
我以前曾经sort | uniq这样做过,这对小型测试文件很有用.对于我的实际问题(从2006年4月的印度国家证券交易所16天的档案订单研究数据中提取公司符号列表,在多个文件中提供了12,000多万条记录),分类负担变得过大.uniq只消除了相邻的重复项.
我使用了复制上面的Win-GNU gawk行
C:\Users\PAPERS\> cat ..\Full*_Symbols.txt | gawk "!_[$0]++" | wc -l
946
Run Code Online (Sandbox Code Playgroud)
建议有9,900多万条记录涉及946家不同的公司,这是一个非常合理的答案.在我的适度Windows机器上花了不到5分钟,经过几个小时的尝试SORT让我失望.
看了我所有的awk文本并在网上搜索了一下,而对于模式的一部分,为什么它工作的解释是明确的(!作为NOT,$0是整个当前记录),对于_我无法找到的下划线任何解释,并++在示例中仅作为"用1更新计数器".
将非常感谢任何适当的文本或网络参考,以充分理解这个例子,因为我认为它也将帮助我在其他相关的情况下.谢谢.最好,
真的很聪明!
它创建了一个关联数组(意思是"索引"可以是任何东西,而不仅仅是一个数字).如果元素不存在(为零)则创建它(通过递增),并且当存在匹配时awk执行默认操作(即打印输入行).一旦找到该值,该值_[$0]将为非零,因此如果再次遇到相同的值,则表达式为false且不打印任何内容.
我认为下划线只是一个"香草"变量名称(你需要一个名称为你的数组,下划线是有效的,monkey但更多"匿名".经典!
没有任何解释,_除了有些人认为通过使用下划线字符作为变量的名称来模糊其代码是很聪明的,在本例中是一个数组.就像在C中一样,awk中的变量名可以从任何字母或下划线开始,但显然意图不是让它们只是一个下划线 - 这太荒谬了!
编写该代码的更常见和合理的方法是命名数组seen或类似代码,以便您了解它的用途:
awk '!seen[$0]++'
Run Code Online (Sandbox Code Playgroud)
上面介绍了一个seen由当前行上的文本索引的数组.首次测试时,每个索引处的数组都为零值,当使用相同的字符串再次测试时,它的值为1,依此类推,因为后增量.因此,只有在输入中看到给定字符串的第一次出现时,该值的否定才是真的,因此它会丢弃后续出现的事件.