如何从另一个文件A中删除文件B上出现的行?

新手上路,请多包涵

我有一个大 文件 A (由电子邮件组成),每封邮件一行。我还有另一个 文件 B ,其中包含另一组邮件。

我将使用哪个命令从文件 A 中删除文件 B 中出现的所有地址。

因此,如果文件 A 包含:

 A
B
C

文件 B 包含:

 B
D
E

然后文件A应该留下:

 A
C

现在我知道这是一个可能被问得更频繁的问题,但我在 网上只找到一个命令 给我一个错误的分隔符错误。

任何帮助将非常感激!肯定有人会想出一个聪明的单线,但我不是外壳专家。

原文由 slhck 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

如果文件已排序(它们在您的示例中):

 comm -23 file1 file2

-23 禁止两个文件中的行,或仅在文件 2 中。如果文件未排序,请先通过 sort 管道…

请参阅 此处的手册页

原文由 The Archetypal Paul 发布,翻译遵循 CC BY-SA 4.0 许可协议

grep -Fvxf <lines-to-remove> <all-lines>

例子:

 cat <<EOF > A
b
1
a
0
01
b
1
EOF

cat <<EOF > B
0
1
EOF

grep -Fvxf B A

输出:

 b
a
01
b

解释:

  • -F :使用文字字符串而不是默认的 BRE
  • -x :只考虑匹配整行的匹配
  • -v : 打印不匹配
  • -f file :从给定文件中获取模式

这种方法在预排序文件上比其他方法慢,因为它更通用。如果速度也很重要,请参阅: 在一个文件中查找不在另一个文件中的行的快速方法?

这是用于在线操作的快速 bash 自动化:

 remove-lines() (
  remove_lines="$1"
  all_lines="$2"
  tmp_file="$(mktemp)"
  grep -Fvxf "$remove_lines" "$all_lines" > "$tmp_file"
  mv "$tmp_file" "$all_lines"
)

GitHub 上游.

用法:

 remove-lines lines-to-remove remove-from-this-file

另请参阅: https ://unix.stackexchange.com/questions/28158/is-there-a-tool-to-get-the-lines-in-one-file-that-are-not-in-another

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题