如何比较两个文件,使第一个文件中的信息从第二个文件中删除?

如何比较两个文件,使第一个文件中的信息从第二个文件中删除?

基本上,我有一个文件,其中包含大约 90 个用户名。

我必须从 passwd 文件中删除所有这些用户名,该文件总共有 300 行长。

我试图想出一种方法来至少过滤重复的用户名并打印出必须保留的用户名,但没有成功。

假设我要删除的 90 个用户名的文件包含:

文件.txt

user1
user2
user3
user4

passwd 文件包含这些用户名以及更多内容

密码

user31
user32
user1
user23
user2
user4
user15
user3

passwd 文件中的用户名是随机分布在文件内的,因此diff -y无法完成这项工作。

我的目标是比较两个文件,例如 cat file.txt 并使用输出在 passwd 内搜索。结果应该是删除重复的行,或者打印唯一的行。

答案1

comm命令可用于比较和对比两个排序的文件:

comm <(sort file.txt) <(cut -d: -f1 /etc/passwd | sort)
  • 第一列包含第一个文件中未出现在第二个文件中的行。
  • 第二列包含第二个文件中未出现在第一个文件中的行。
  • 第三列包含两个文件中都出现的行。

您可以从三列输出中省略一列或两列(comm -13 ...例如,将省略第 1 列和第 3 列)。


您的问题中没有问到,但在后续命令中请求如何获取用户名列表并从中提取相应的条目/etc/passwd

( echo root; echo sys ) | sed -r 's!(.*)!^\1:!' | grep -f - /etc/passwd
root:x:0:0:root:/root:/bin/bash
sys:x:3:3:sys:/dev:/usr/sbin/nologin

答案2

我认为最简单的方法可能是:

grep -v -x -f file_infotodelete reference_file  > result_file  

答案3

使用下面的awk oneliner来实现。

以下命令将从文件 passwd 中删除 file.txt 内容。测试了一下效果很好

awk 'NR==FNR{a[$1];next}!($1 in a){print $1}' file.txt passwd

相关内容