awk +删除除第一行uniq(文件名)以外的所有非uniq行

时间:2010-06-15 12:30:49

标签: scripting sed awk

嗨我有以下文件如何通过sed删除除第一个uniq文件名之外的所有文件名行例如需要从文件中删除除第一个之外的所有文件名行:

FILE NAME: /dir1/dir2/dir3/dir4/dir5/file
FILE NAME: /dirA/dirB/dirC/dirD/dirE/file

文件:

FILE NAME: /dir1/dir2/dir3/dir4/dir5/file
PARAMETER NAME: blablabla
TARGET FILE: 12
SOURCE FILE: 565
FILE NAME: /dir1/dir2/dir3/dir4/dir5/file
PARAMETER NAME: blablabla
TARGET FILE: 18
SOURCE FILE: 552
FILE NAME: /dir1/dir2/dir3/dir4/dir5/file
PARAMETER NAME: blablabla
TARGET FILE: 14
SOURCE FILE: 559
FILE NAME: /dirA/dirB/dirC/dirD/dirE/file
PARAMETER NAME: blablabla
TARGET FILE: 134
SOURCE FILE: 344
FILE NAME: /dirA/dirB/dirC/dirD/dirE/file
PARAMETER NAME: blablabla
TARGET FILE: 13
SOURCE FILE: 445
FILE NAME: /dirA/dirB/dirC/dirD/dirE/file
PARAMETER NAME: blablabla
TARGET FILE: 13
SOURCE FILE: 434

3 个答案:

答案 0 :(得分:0)

如果您只想要唯一的文件名行,例如您为所示示例列出的两行,

  

grep“^ FILE NAME”input.txt |排序| uniq


更新:
我不确定你真正想要的是什么 sort | uniq过滤器会在"^FILE NAME"开头的行中获取所有唯一路径名称。如果您的样本输入和输出不正确,您可能需要使用edit按钮进行更正。

答案 1 :(得分:0)

在awk中,问题标记为:

awk '$0  ~ /^FILE NAME: / { if (count++ == 0) print; }
     $0 !~ /^FILE NAME: / {                   print; }'

你可能可以用sed来做,但它并不是特别干净。


评论稍微澄清了这个问题。答案非常相似,但区别很重要:

awk '$0  ~ /^FILE NAME: / { if (count[$0]++ == 0) print; }
     $0 !~ /^FILE NAME: / {                       print; }'

我仍然假设您想要所有其他行 - 示例输出仅显示'FILE NAME'行,但问题没有说明删除其他行。显然,如果您不想要其他行,请删除awk脚本的第二行。

答案 2 :(得分:0)

您可以在AWK中使用关联数组,如果某行包含“FILE NAME”,请检查它是否在数组中。如果是,那么不要打印它。如果不是,则将其保存在阵列中并打印出来。对于任何不包含“文件名”的行,请打印它们。