Linux 如果末尾有公共文本,则删除除一行以外的所有行
这是非常具体的,在其他答案中找不到这种情况 以下是示例文本:Linux 如果末尾有公共文本,则删除除一行以外的所有行,linux,awk,Linux,Awk,这是非常具体的,在其他答案中找不到这种情况 以下是示例文本: exampleA/file_A.a exampleB/file_A.a exampleB/another_dir/file_B.a exampleB/file_A.a exampleA/file_C.a exampleB/file_D.b exampleB/file_C.a exampleB/file_B.a exampleA/another_dir/file_D.b exampleA/another_dir/file_C.a e
exampleA/file_A.a
exampleB/file_A.a
exampleB/another_dir/file_B.a
exampleB/file_A.a
exampleA/file_C.a
exampleB/file_D.b
exampleB/file_C.a
exampleB/file_B.a
exampleA/another_dir/file_D.b
exampleA/another_dir/file_C.a
exampleB/another_dir/another_one/file_D.b
我想删除具有特定扩展名(.a)的复制文件的行,该扩展名可能出现在此文件列表(文本文件)中,但只有一行除外,因此每个文件的文本仅包含一行。但是文件可能比fileA.a、fileB.a和fileC.a更多,所以我不能“硬编码”这些文件
如何搜索结尾包含相同文件的行?我设法做到了这一点:(我要删除的文件的扩展名始终是.a,文件名可以在任何地方包含下划线,我不想删除扩展名为.b的文件,因为它们的目的是相同的,并且总是在不同的文件夹中)
但我没有行号
那么,除了一行之外,我如何删除这些行呢?我在一个问题中看到了下一行:
awk '!seen[$0]++' file.txt
但我不知道如何将这些结合起来以获得我需要的输出,应该是这样的:
exampleA/file_A.a
exampleB/another_dir/file_B.a
exampleA/file_C.a
exampleB/file_D.b
exampleA/another_dir/file_D.b
exampleB/another_dir/another_one/file_D.b
谢谢
编辑:我忘了提到文本中还有另一个文件有另一个扩展名(比如.b),我不想碰它们。我只想删除具有特定扩展名(.a)的扩展名,如果它们出现,可能还会删除另一个扩展名(.d),但这不是非常必要的。我编辑了样本
awk -F/ '$NF!~/\.(a|d)$/|| !seen[$NF]++' file.txt
exampleA/file_A.a
exampleB/another_dir/file_B.a
exampleA/file_C.a
exampleB/file_D.b
exampleA/another_dir/file_D.b
exampleB/another_dir/another_one/file_D.b
你应该做你想做的。请注意,在您的输入示例中有文件\u C.a
和文件C.a
我们要做的是告诉awk
使用/
作为字段分隔符,并且只使用文件名部分,即最后一个字段$NF
,作为数组索引
你应该做你想做的。请注意,在您的输入示例中有文件\u C.a
和文件C.a
我们要做的是告诉
awk
使用/
作为字段分隔符,并且只使用文件名部分,即最后一个字段$NF
,作为数组索引。您可以使用此awk
:
awk-F/'NF&(!/\.a$/| |!已查看[$NF]+])文件
示例A/file_A.A
示例B/另一个目录/文件B.a
示例a/file_C.a
示例b/文件\u D.b
示例A/另一个目录/文件D.b
示例b/另一个目录/另一个目录/文件D.b
这里
将-F/
设置为输入文件分隔符/
选择所有非空行NF
- !/。a$/| | |!seen[$NF]+
.a`结尾,或者第一次读取最后一个字段,则打印一行:如果不是以
- 您可以使用此
awk
:
awk-F/'NF&(!/\.a$/| |!已查看[$NF]+])文件
示例A/file_A.A
示例B/另一个目录/文件B.a
示例a/file_C.a
示例b/文件\u D.b
示例A/另一个目录/文件D.b
示例b/另一个目录/另一个目录/文件D.b
这里
将-F/
设置为输入文件分隔符/
选择所有非空行NF
- !/。a$/| | |!seen[$NF]+
.a`结尾,或者第一次读取最后一个字段,则打印一行:如果不是以
awk -F/ '$NF!~/\.(a|d)$/|| !seen[$NF]++' file.txt
exampleA/file_A.a
exampleB/another_dir/file_B.a
exampleA/file_C.a
exampleB/file_D.b
exampleA/another_dir/file_D.b
exampleB/another_dir/another_one/file_D.b