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