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`结尾,或者第一次读取最后一个字段,则打印一行

      哦,是的,那是个打字错误。谢谢这是有效的,但我忘了提到文本中还有其他扩展名为(.b)的文件,我不想删除这些文件。这些可以重复。@GuilleTrejo-这样更好吗?是的,谢谢你,伙计!不过我会坚持使用@anubhava解决方案,因为它更通用。但你的也行。谢谢!不用担心-是什么让它“更通用”?哦,是的,那是个打字错误。谢谢这是有效的,但我忘了提到文本中还有其他扩展名为(.b)的文件,我不想删除这些文件。这些可以重复。@GuilleTrejo-这样更好吗?是的,谢谢你,伙计!不过我会坚持使用@anubhava解决方案,因为它更通用。但你的也行。谢谢!不用担心-是什么让它“更通用”?太好了!谢谢这样就可以了,但是如果我可以使用类似(它不以.a结尾)的东西来代替正则表达式\.b$(以.b结尾),那就太好了。可以吗?当然可以,现在检查我的更新答案!谢谢这样就可以了,但是如果我可以使用类似(它不以.a结尾)的东西来代替正则表达式\.b$(以.b结尾),那就太好了。可以吗?当然,现在检查我的更新答案
      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