如何使用 uniq 删除重复行块?

如何使用 uniq 删除重复行块?

无论如何,是否可以使用uniq(或类似的)从日志类型输出中过滤/删除重复行集?我正在调试 MPI 代码,其中多个处理器经常打印相同的精确输出。uniq当输出是一行时效果很好,但代码经常会生成多行。这是一个例子:

calling config()
calling config()
calling config()
running main loop
  time=0
running main loop
  time=0
running main loop
  time=0
output from Rank 0

被过滤uniq(不带选项):

calling config()
running main loop
  time=0
running main loop
  time=0
running main loop
  time=0
output from Rank 0

有没有一种简单的方法来过滤n行块?我已经阅读并重读了联机帮助页,但找不到任何明显的内容。谢谢!

更新:我希望输出将重复的块压缩为单个条目,因此在上面的示例中:

calling config()
running main loop
  time=0
output from Rank 0

答案1

$ awk '!a[$0]++' file
calling config()
running main loop
  time=0
output from Rank 0

答案2

来自 uniq 手册页:

注意:“uniq”不会检测重复的行,除非它们相邻。

但你可以用一个简短的 bash 脚本来做到这一点,如下所示:

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n'

declare -r file=${1:?Please enter a filename to treat as first parameter}

linenum=0
for line in $(cat "${file}"); do
  linenum="$((linenum + 1))"
  freq=$(sed -n "1,${linenum} p" "${file}" | grep -c "${line}")
  [[ ${freq} == 1 ]] && echo "${line}"
done

在你的情况下会产生:

calling config()
running main loop
  time=0
output from Rank 0

相关内容