我想删除所有独立且出现 3 次或以上的单词,而不保留第一个匹配项。我所说的“独立”是指完整的词。不是某个单词的一部分的模式。我发现awk '++A[$0] < 3'
,但这查看的是整条线,而不仅仅是模式。我必须先数一下单词数,然后排除出现过 3 次或以上的所有内容?
当我寻找这个时,它都是关于使用$0
整行检查单词并在模式匹配时删除行。不仅仅是单词/模式本身。我不仅仅是在寻找 awk。除了perl
哈哈哈什么都可以。
我也想排除Shares for
并[--- Listable Shares ---]
避免被删除。如果命令不太复杂的话,我可能可以自己找到这个。否则请将其添加到答案中并给出一些解释。我喜欢在这里继续学习
输入:
Shares for DED-SHD-ED-1:
[--- Listable Shares ---]
backup backup2
Shares for DED-SHD-ED-2:
[--- Listable Shares ---]
ConsoleSetup REMINST SCCMContentLib$ SCCMContentLibC$ SEFPKGC$ SEFPKGD$ SEFPKGE$ SEFSIG$ Source UpdateServicesPackages WsusContent backup backup2
Shares for DED-SHD-BE-03:
[--- Listable Shares ---]
backup backup2 print$
预期输出:
Shares for DED-SHD-ED-1:
[--- Listable Shares ---]
Shares for DED-SHD-ED-2:
[--- Listable Shares ---]
ConsoleSetup REMINST SCCMContentLib$ SCCMContentLibC$ SEFPKGC$ SEFPKGD$ SEFPKGE$ SEFSIG$ Source UpdateServicesPackages WsusContent
Shares for DED-SHD-BE-03:
[--- Listable Shares ---]
print$
仅backup
和backup2
被删除。
编辑:
print$
作为一个整体被认为是需要删除的单词,以防出现 3 次或以上。不是print
没有$
我希望很快能收到你们的来信!
由于要求覆盖最大 1MB 的文件,因此需要进行几次数组反转以提高效率。因为我们要删除单词,所以我认为保留精确的间距并不重要,因此替换行中的每个单词前面都带有 TAB。
它是一个包含单个 shell 函数的 Bash 脚本,该函数本身包含一个 awk 程序。它采用一个输入文件参数,并输出到 stdout。
我不确定您想如何验证结果。我在开发过程中进行了大量调试:(例如)将删除的单词及其频率记录到 stderr 会很容易。
使用 GNU
awk
作为第四个参数来split()
保存与 匹配的字符串,FS
这样我们就可以在输出中拥有与输出中相同的间距:while ( match(...) )
您可以在任何 awk 中使用循环而不是执行相同的操作split(...); for (...)
,它只是多几行代码,例如这将在任何 awk 中工作:编辑:@Paul_Pedant 和我在评论中讨论了将输入读取到数组中,然后像他的脚本
END
一样在该部分中处理它与像我上面的脚本一样读取输入文件两次的优点/缺点,所以我把我的放在shell 脚本并添加了 bash shebang:然后创建一个输入文件,该文件是 OPs 9 行输入文件的 100 万个副本,方法如下:
然后定时执行我的脚本:
但是当我尝试在其上运行 Pauls 脚本时:
我的笔记本电脑开始听起来像直升机起飞,所以 5 分钟后我中断了它,然后又等了大约 3 分钟,让我的笔记本电脑再次稳定下来。
然后我在 100k 次文件上尝试了这两种方法:
但最终我还是不得不打断 Pauls(我给了这个 10 分钟)。
然后我尝试了 10k 次文件:
这次我得到了两者的输出,所以我对
diff -b
它们运行了,发现输出是不同的 -我的删除了行尾的重复值,
Shares for ...
而保罗的则没有。idk 这将是 OP 期望的行为,或者即使它很重要,它也可能只是不切实际的输入。然后我尝试了 1k 次:
和 100 次:
因此,对于大约 1k 或更少的 OP 数据重复(即最多大约 10k 行输入文件),无论您将数据存储在内存中并在 END 部分进行解析,还是读取输入文件两次,都与执行有关速度(一旦你进入十分之一秒的执行时间谁在乎?)并且在大约 10k 重复(大约 100k 输入行)时,两次读取方法要快一些,但两者在大约 1 秒的执行时间下都很快。但是,一旦输入文件大小大于此值,您确实不想尝试将其存储在内存中。