regex - 根据第二个文本文件从文本文件中删除重复项

标签 regex bash unix text editor

如何通过检查第二个文本文件 (removethese.txt) 从文本文件 (main.txt) 中删除所有行。如果文件大于 10-100mb,什么是有效方法。 [使用苹果机]

示例:

main.txt
3
1
2
5

删除这些行

removethese.txt
3
2
9

输出:

output.txt
1
5

示例行(这些是我正在使用的实际行 - 顺序无关紧要):

ChIJW3p7Xz8YyIkRBD_TjKGJRS0
ChIJ08x-0kMayIkR5CcrF-xT6ZA
ChIJIxbjOykFyIkRzugZZ6tio1U
ChIJiaF4aOoEyIkR2c9WYapWDxM
ChIJ39HoPKDix4kRcfdIrxIVrqs
ChIJk5nEV8cHyIkRIhmxieR5ak8
ChIJs9INbrcfyIkRf0zLkA1NJEg
ChIJRycysg0cyIkRArqaCTwZ-E8
ChIJC8haxlUDyIkRfSfJOqwe698
ChIJxRVp80zpcEARAVmzvlCwA24
ChIJw8_LAaEEyIkR68nb8cpalSU
ChIJs35yqObit4kR05F4CXSHd_8
ChIJoRmgSdwGyIkRvLbhOE7xAHQ
ChIJaTtWBAWyVogRcpPDYK42-Nc
ChIJTUjGAqunVogR90Kc8hriW8c
ChIJN7P2NF8eVIgRwXdZeCjL5EQ
ChIJizGc0lsbVIgRDlIs85M5dBs
ChIJc8h6ZqccVIgR7u5aefJxjjc
ChIJ6YMOvOeYVogRjjCMCL6oQco
ChIJ54HcCsaeVogRIy9___RGZ6o
ChIJif92qn2YVogR87n0-9R5tLA
ChIJ0T5e1YaYVogRifrl7S_oeM8
ChIJwWGce4eYVogRcrfC5pvzNd4

最佳答案

有两种标准方法可以做到这一点:

使用grep:

grep -vxFf removethese main

这使用:

  • -v 反转匹配。
  • -x 匹配整行,例如,防止 he 匹配 hellohighway to hell
  • -F 使用固定字符串,以便参数按原样使用,而不是解释为正则表达式。
  • -f 从另一个文件中获取模式。在这种情况下,从 removethese

使用awk:

$ awk 'FNR==NR {a[$0];next} !($0 in a)' removethese main
1
5

像这样,我们将 removethese 中的每一行存储在数组 a[] 中。然后,我们读取 main 文件并只打印数组中不存在的那些行。

关于regex - 根据第二个文本文件从文本文件中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30820894/

相关文章:

linux - 为什么在 Linux 中父进程被杀死后子进程仍然存在?

正则表达式匹配特定的数字格式

c++ - std::regex_match与字符éèà

regex - 在 SSMS 2016 中使用正则表达式替换来修剪线条

linux - 将列表插入字符串

linux - 带有 "while"循环和数字测试的 shell 脚本不起作用

regex - Selenium :是否可以在 Selenium 定位器中使用正则表达式

bash - 让 ssh 在目标机器上后台执行命令

regex - 使用正则表达式或在 cat

unix - awk,为不同的值创建列