首页 > 解决方案 > 使用 awk 删除重复结果

问题描述

我有一个给定的库列表,需要在特定文件夹中找到它们并提供摘要报告。

我做了什么:

  1. 我将库放入一个文件中,每个库都在一行中
  2. 我在 while 循环中使用 readline 读取每一行(lib)
  3. 使用 find 命令检查它们并使用 awk 过滤
while IFS= read -r line; 
   do find DIR1 DIR2 DIR3 -type f -name $line | awk -v pattern=$line -F/ '{print $1"\t"pattern"\t\t"$4}';
   done < libList

Liblist 就像

libA
libB
libC
.
.

结果如下所示,但前 4 个结果实际上与我不想考虑某些子文件夹中存在 libs 相同。

我怎么能只显示一次那些重复的?我如何按第一个 DIR 然后 Lib 名称然后 Example 对结果进行排序?

我知道这 '!_[$0]++'消除了重复,但在我的情况下,我认为需要对像 A[$1$4]++ 这样的东西进行条件处理,但不能真正解决它以及如何将模式放在那里 A[$1$2]B[pattern]++ ?

**DIR3  libA    example1
DIR3    libA    example1
DIR3    libA    example1
DIR3    libA    example1**
DIR3    libB    example2
DIR3    libB    example2
DIR3    libB    example1
DIR3    libB    example1
DIR3    libB    example1
DIR3    libB    example1
DIR2    libC    example3
DIR2    libC    example3
DIR3    libC    example3
DIR3    libC    example3
DIR3    libC    example2
DIR3    libC    example2
DIR3    libC    example1
DIR3    libC    example1
DIR3    libC    example1
DIR3    libC    example1
DIR1    libD    example2
DIR1    libD    example2
DIR3    libD    example2
DIR3    libD    example2
DIR3    libD    example1
DIR3    libD    example1
DIR2    libE    example4
DIR2    libE    example4
DIR2    libC    example3
DIR2    libC    example3

标签: awkconditional-associations

解决方案


这可能是您正在寻找的:

while IFS= read -r line; do
    find DIR1 DIR2 DIR3 -type f -name "$line"
done < libList |
awk -F'/' -v OFS='\t' '{print $1, $NF, "", $4}' |
sort -u

但没有看到它的几行样本输出find DIR1 DIR2 DIR3 -type f -name "$line"是一个猜测。

你可以使用

awk -F'/' -v OFS='\t' '{val=$1 OFS $NF OFS OFS $4} !seen[val]++{print val}'

awk '...' | sort -u如果您愿意,可以代替上面的。


推荐阅读