下面是两个示例文件列表。我需要比较(文件)列表的文件 - 每个记录的最后一个“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