【问题标题】:How to remove both matching lines while removing duplicates如何在删除重复项的同时删除两个匹配行
【发布时间】:2014-11-15 05:37:54
【问题描述】:

我有一个包含名为“main”的电子邮件列表的大文本文件,我已向其中一些人发送了邮件。我有一个“已发送”电子邮件的列表。现在,我想从“主要”列表中删除“已发送”电子邮件。

换句话说,我想从文本文件中删除匹配的原始文件,同时删除重复项。示例:

我有:

email@email.com
test@test.com
email@email.com

我想要:

test@test.com

有没有更简单的方法来实现这一点?请建议一种工具或方法来执行此操作,但请考虑文本文件大于 10MB。

【问题讨论】:

  • Notepadd++ 是否支持正则表达式/脚本?
  • 您可能可以使用 power shell compare-object cmdlet technet.microsoft.com/en-us/library/ee156812.aspx
  • 我不完全确定您的要求。但是如果你的主列表和发送列表在同一个文件中,也许my answer here 可以帮助你。
  • @leopard121 remove both the matching raw from the text file 是什么意思?
  • @stema 感谢您的链接。该代码有效,但不会删除所有匹配的行。我的意思是,如果有 10 个重复的行,它会删除 9 个,但我需要全部删除。

标签: regex csv text editor notepad++


【解决方案1】:

在终端:

cat test| sort | uniq -c | awk -F" " '{if($1==1) print $2}'

【讨论】:

  • 你能详细说明你的答案吗?
  • 你能再解释一下吗?
【解决方案2】:

我经常将cygwin 用于此类任务,因为 unix 命令行非常强大。

这里是如何实现你想要的:

cat main.txt | sort -u | grep -Fvxf sent.txt

sort -u 将删除重复项(首先对 main.txt 文件进行排序),grep 将负责删除不需要的地址。

grep 选项的含义如下:

  • -F纯文本搜索
  • -v 反转结果
  • -x 将强制整行匹配模式
  • -f 从指定文件读取模式

哦,如果您的文件是 Windows 格式(CR LF 换行符),您将不得不这样做:

cat main.txt | dos2unix | sort -u | grep -Fvxf <(cat sent.txt | dos2unix)

就像使用 Windows 命令行一样,您可以简单地添加:

> output.txt

在命令行末尾将输出重定向到文本文件。

【讨论】:

  • 非常感谢。但是有没有办法在 Notepad++ 或任何其他类似的基于 Windows 的软件中做到这一点。
  • 这要求文本编辑器处理太多了,但 cygwin 适用于 windows。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多