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

관련 정보