Bash 比较两个列表找到缺失的项目

Bash 比较两个列表找到缺失的项目

下面是两个示例文件列表。我需要比较(文件)列表的文件 - 每个记录的最后一个“X”字符到最后一个“/”的右侧。

如果找不到文件名,我需要将整行发送到第三个文件作为输出。

这些是文件列表,第二个列表中可能是三个文件,第一个列表中可能有两千个文件。
第一:
1 /home/dev/share/Datafiles/cases.dbf
2 /home/dev/share/Datafiles/cells.csv
3 /home/dev/share/Datafiles/clusters.db
4 /home/dev/share/Datafiles /competition.csv
5 /home/dev/share/Datafiles/coplot.csv
6 /home/dev/share/Datafiles/daphnia.csv
7 /home/dev/share/Datafiles/das.txt
8 /home/dev/share /Datafiles/deaths.sas7bdat
9 /home/dev/share/Datafiles/decay.csv
10 /home/dev/share/Datafiles/example.db
11 /home/dev/share/Datafiles/fertyield.lst
12 /home/dev /share/Datafiles/fisher.csv

两个:
1 /test/kitchen/cooks/transfer/cases.dbf
2 /test/kitchen/cooks/transfer/cells.csv
3 /test/kitchen/cooks/transfer/clusters.db
4 /test/kitchen/cooks/transfer /coplot.csv
5 /test/kitchen/cooks/transfer/das.txt
6 /test/kitchen/cooks/transfer/deaths.sas7bdat
7 /test/kitchen/cooks/transfer/decay.csv
8 /test/kitchen/cooks /transfer/example.db
9 /test/kitchen/cooks/transfer/fertyield.lst
10 /test/kitchen/cooks/transfer/fisher.csv

在列表 1 中存在的列表 2 中未找到的两个文件:“Competition.csv”(#4) 和“daphinia.csv”(#6)。

对文件进行排序不起作用,文件路径可能非常短或非常长,并且可以在多个目录中找到文件的多个副本。

Comm/diff/cmp 产生的结果并不令人满意,因为我只是在每行右侧查找最后一个“X”字符(基于文件名、扩展名)。
(在 Microsfot EXCEL 中,我只需将所有内容提取到右侧)最后一个“/”的逐行保存到另一个列表中,然后用第一个列表对该列表进行 VLOOKUP。)

但这不是 Microsoft 安装。

一个脚本到 awk 列表(文件)二的内容,并搜索列表(文件)一,输出与文件三不匹配?

另外,用 sed 解析目录名并只留下两个文件名列表也很困难 - 不知道我要替换哪些路径,因为它们每次都会不同。我尝试过 cut,但文件名的开头可以是从第 10 列到第 150 列的任何位置。我的直觉是必须有一种方法来隔离文件路径中最后一个“/”右侧的所有字符。

话又说回来,我可能是错的。

答案1

使用grep

grep -F -x -v -f <(grep -o '[^/]*$' file2) <(grep -o '[^/]*$' file1) > file3

内部的两个grep返回每行的文件名部分(最后一个之后的所有内容/),外部grep的使用第一个内部的输出作为第二个参数的grep模式输入文件( )。-f

即它返回 file1 中存在的 file2 的所有文件名反转 ( -v)。输出被重定向到 file3。 Option-F用于匹配固定字符串而不是正则表达式并-x匹配整行。

内容file3

$ cat file3
competition.csv
daphnia.csv

相关内容