【问题标题】:Remove duplicate results by using awk使用 awk 删除重复结果
【发布时间】:2020-07-30 13:25:05
【问题描述】:

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

我做了什么:

  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 个结果实际上是相同的 因为我不想考虑某些子文件夹中是否存在库。

我怎样才能只显示一次那些重复的? 如何按第一个 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

【问题讨论】:

  • 如果已经排序,添加|uniq,否则添加|sort|uniq :-P
  • 我知道 uniw,但是当我在 awk 的尾部添加“uniq”时,所有结果都会以一种有趣的方式扭曲。我记得有一种方法可以做到这一点,例如 if ( !_A[$1$4] );print... 对字段进行分组并创建分组条件有什么想法吗?
  • 将输出重定向到文件并使用 uniq 吗?结果又以何种方式“扭曲”?
  • 我想我应该摆脱所有的while循环并在awk中运行awk命令调用系统,现在while循环每次迭代都会传递一行,所以awk无法进行比较..
  • 是的 Chatterone 它出现在我的脑海中,然后它会给出请求 我试过了 谢谢,我没有创建另一个文件,我更愿意在旅途中解决所有问题,但它可以,因为它给了我什么想要。

标签: awk conditional-associations


【解决方案1】:

这可能是您正在寻找的:

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

【讨论】:

  • 谢谢 Ed,sort 在第一个建议中工作了,第二个解决方案也很好我只是在那里做了一个小改动,使用 "printf("%-40s %-40s %s\n"有很好的结果。我以前从未见过“!seen”这个词很好地了解它
【解决方案2】:
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 > result_file

cat result_file | uniq| sort

会提供我需要的 谢谢

【讨论】:

    【解决方案3】:

    应用 Ed 的建议后:

    while IFS= read -r line; 
    do find DIR1 DIR2 DIR3 -type f -name "$line";
    done < libList | 
    awk -F'/' '{val=$1$NF$4} !seen[val]++{printf("%-40s %-40s %s\n", $NF,$1,$4)}' 
    

    【讨论】:

      猜你喜欢
      • 2017-04-25
      • 1970-01-01
      • 2011-11-30
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      相关资源
      最近更新 更多