我是 AWK 新手,使用移植到 Windows (UNXUtils) 的 GNU 实用程序和 gawk 而不是 awk。该论坛上的解决方案的工作原理如下绝对的魔法,并且我正在尝试找到一个可以阅读的来源,以更好地理解该解决方案中提供的模式表达式。
In 从 UNIX shell 脚本中的列表中选择唯一或不同的值 https://stackoverflow.com/questions/618378/select-unique-or-distinct-values-from-a-list-in-unix-shell-scriptDimitre Radoulov 的回答提供了以下代码
zsh-4.3.9[t]% awk '!_[$0]++' file
作为选择具有重复和混乱元素的列表中的元素的解决方案,仅列出每个元素一次。
我以前用过sort | uniq
这样做,这对于小型测试文件来说效果很好。对于我的实际问题(从 2006 年 4 月印度国家证券交易所历时 16 天的档案订单簿研究数据中提取公司代码列表,多个文件中有 1.29 亿条记录),排序负担变得太大了。而uniq只是消除相邻的重复项。
为我的 Win-GNU gawk 复制上面的行,我使用
C:\Users\PAPERS\> cat ..\Full*_Symbols.txt | gawk "!_[$0]++" | wc -l
946
表明超过 1.29 亿条记录属于 946 个不同的公司,这是一个非常合理的答案。在我的普通 Windows 机器上花了不到 5 分钟的时间,经过几个小时的尝试排序让我筋疲力尽。
查看了我拥有的所有 awk 文本并在网上进行了一些搜索,而对于部分模式,其工作原理的解释很清楚(!
用作 NOT,$0
是整个当前记录),对于下划线_
我找不到任何解释,并且已经看到++
在示例中仅作为“将计数器更新 1”。
将不胜感激任何适当的文本或网络参考来充分理解这个例子,因为我认为它也会对我在其他相关案例中有所帮助。谢谢。最好的,