我有一个包含三列的 CSV 文档。第 1 列有 MD5 校验和。第 2 列包含文件的路径。第 3 列为空或具有唯一标识符。
例子
0000801f8b7a5c3b483809ef069d4d82,/Volumes/Somepath2/Somefile1,Uniquecode
0000801f8b7a5c3b483809ef069d4d82,/Volumes/Somepath2/Somefile2,Uniquecode
0044f99638140c2eec15aa78eeb41d5e,/Volumes/Somepath3/Somefile2,
0044f99638140c2eec15aa78eeb41d5e,/Volumes/Somepath4/Somefile3,Uniquecode
005040886c659d73c8596b40a70ff231,/Volumes/Somepath5/Somefile4,
005040886c659d73c8596b40a70ff231,/Volumes/Somepath6/Somefile4,
我想做的是仅打印具有匹配校验和的行,并且文件是否填充了唯一代码字段,但如果该文件与也具有唯一代码的另一个文件匹配,则不打印。所以在上面的例子中,我只会得到下面的打印内容。
0044f99638140c2eec15aa78eeb41d5e,/Volumes/Somepath4/Somefile3,Uniquecode
前两个文件与校验和匹配,但都共享唯一代码,我不想打印该代码。最后两个匹配校验和,但都没有填写 3 字段,但中间两个匹配,并且只有一个填写了 uniquecode。列表中有超过 2 个文件与校验和匹配的实例。
我试图使用 awk 来做到这一点,但我不太熟悉它,也不知道如何放入所有这些规则。
任何帮助将不胜感激。
答案1
$ awk -F, 'NR==FNR{a[$1,$3]; next} ($3 != "") && (($1,"") in a)' file file
0044f99638140c2eec15aa78eeb41d5e,/Volumes/Somepath4/Somefile3,Uniquecode
上面执行了两次文件传递,第一次创建一个由输入的第一个和第三个字段串联索引的数组,第二次测试正在填充的第三个字段和由第一个字段的串联组成的索引字段和数组中存在的空字符串,如果存在,则打印当前行。