Uniq

如何使用 uniq 刪除重複行塊?

  • May 8, 2020

無論如何使用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
$ awk '!a[$0]++' file
calling config()
running main loop
 time=0
output from Rank 0

從 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

引用自:https://unix.stackexchange.com/questions/585247