uniqを使用して重複行ブロックを削除するには?

uniqを使用して重複行ブロックを削除するには?

uniqログタイプ出力で重複行セットをフィルタリング/削除するために使用するか、同様の方法がありますか?複数のプロセッサがしばしば同じ出力を印刷するMPIコードをデバッグしています。uniqこれは出力が1行のときにうまく機能しますが、コードはしばしば複数の行を生成します。例は次のとおりです。

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

関連情報