linux - 如何从另一个文本文件中取出一个文本文件的内容?

标签 linux bash shell command-line

所以我想从另一个文本文件中取出一个文本文件的内容,但是要处理非常大的数据集

文件 1:

ligand1
ligand6
ligand9
ligand4

文件 2:

ligand1
ligand9

输出文件

ligand6
ligand4

我一直在使用这个 grep -v -x -f file1.txt file2.txt > new_file.txt 但是在大数据集上它崩溃了

最佳答案

您可以为此使用一个简单的 awk 逻辑:-

$ awk 'NR==FNR{list[$0];next} !($0 in list)' file_2 <(tr -d ' ' <file_1)
ligand6
ligand4

然后可以将其写入某个临时路径中的文件,例如

awk 'NR==FNR{list[$0];next} !($0 in list)' file_2 <(tr -d ' ' <file_1) > /tmp/newFile

file_1 上的 tr 命令去除破坏 awk 替换的前导空格

逻辑很简单:-

  • FNRNR 跟踪每个文件中的行,因此当使用多个文件时,NR 会跨文件保持事件状态并且 FNR 在单个文件后重置(如果第一个输入有 5 行,第二个输入有 10 行,则 NR 将为 1,2,3...15 并且 FNR 将是 1...5 然后 1...1)
  • NR==FNRnext 的意思是,这部分代码只对 file_2 有效,即基本上 file_2 的所有内容都被复制到 awk 名为 list 的数组。
  • !($0 in list) 然后对 file_1 应用操作,该操作将仅打印那些不存在于 file_2 中的行。就是这样!

注意:- 如果额外的前导空格是意外的并被删除,则整体命令性能可能会更快一些,因为这现在去除了每一行的空格。

关于linux - 如何从另一个文本文件中取出一个文本文件的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38481117/

相关文章:

linux - strcmp 用法错误?

linux - 用于终止 Java 进程的 Shell 脚本 - 不工作

linux - AWS EC2 错误 : -bash: cannot create temp file for here-document: No space left on device

bash - 如何调试用 "exec"调用的 shell 脚本?

linux - 奇怪的 awk 行为,$1 被打印但 $0 不是?

bash - 在 Unix 中将文件中的行从行号 `n1` 移动到行号 `n2`

shell - 如何在 mac 上使用 Shell 脚本检查是否安装了 subversion

macos - 从 find : why is -not -path not working? 中排除子目录

linux - 在 heredoc 中使用时如何转义 awk 的内置变量

linux - 阻止所有内部流量,除了来自单个端口上特定 IP 的传入流量