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

Geo*_*e.S 3 text-processing

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

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

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

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

文件.txt

user1
user2
user3
user4
Run Code Online (Sandbox Code Playgroud)

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

密码

user31
user32
user1
user23
user2
user4
user15
user3
Run Code Online (Sandbox Code Playgroud)

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

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

fra*_*s P 6

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

grep -v -x -f file_infotodelete reference_file  > result_file  
Run Code Online (Sandbox Code Playgroud)


roa*_*ima 6

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

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

您可以从三列输出中省略一两列(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
Run Code Online (Sandbox Code Playgroud)