📌  相关文章
📜  awk 如何删除一个文件中在另一个文件中找到的行 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:13:34.165000             🧑  作者: Mango

awk 如何删除一个文件中在另一个文件中找到的行

想要删除一个文件中在另一个文件中找到的行,可以使用awk命令来完成。awk是一个强大的文本处理工具,它可以对文本进行各种操作,包括查找、替换、过滤等等。本文将介绍如何使用awk命令来删除一个文件中在另一个文件中找到的行。

实现方法

假设我们有两个文件:file1和file2,我们要在file1中删除在file2中出现的行。具体实现方法如下:

awk 'NR==FNR{a[$0];next}!($0 in a)' file2 file1 > file1_new

这行awk命令主要是用到了两个参数:

  • NR是awk内置变量,表示当前处理的行号。
  • FNR也是awk内置变量,表示当前处理的文件的行号。
代码解析

我们先来看一下这个命令的大致流程:

  1. 首先,awk会读取文件file2,并将文件中的所有行存在一个数组a中。
  2. 接着,awk会读取文件file1,并检查每一行是否在数组a中出现过。
  3. 如果某一行没有在数组a中出现过,那么这一行就会被输出到标准输出流中,也就是我们在命令后面通过">"操作符指定的文件file1_new中。
  4. 如果某一行在数组a中出现过,那么这一行就会被删除,不会被输出到标准输出流中。

让我们逐行解析一下这个awk命令的具体内容:

  • NR==FNR{a[$0];next}

这一行代码是针对file2文件的。它的含义是,如果当前正在处理的行是file2中的行,就将这一行存储到数组a中。由于这一行只对file2文件有用,所以在存储完这一行后,使用next语句跳过当前行,进入下一行的处理。

  • !($0 in a)

这一行代码是针对file1文件的。它的含义是,如果当前正在处理的行不在数组a中,就输出这一行。由于我们在命令行中使用了">"操作符,所以输出的内容会被重定向到file1_new文件中。

总结

通过上面这个awk命令,我们可以轻松地删除一个文件中在另一个文件中找到的行。这个命令的核心思路是,通过awk的数组特性将一些数据存储起来,然后对另一个文件进行处理,根据之前存储的数据来判断哪些行需要输出,哪些行需要删除。这个思路在文本处理中非常实用,我们在实际应用中也可以根据需要进行适当的修改。