テストを生成し、出力を予測するツールがあります。アイデアは、失敗した場合に予測を実際の出力と比較して、それらがどこで分岐したかを確認できるということです。問題は、実際の出力にいくつかの行が 2 回含まれており、混乱を招くことdiff
です。簡単に比較できるように、重複を削除したいと思います。基本的にsort -u
、並べ替えなしのようなものです。
これを行うことができるUNIXコマンドラインツールはありますか?
テストを生成し、出力を予測するツールがあります。アイデアは、失敗した場合に予測を実際の出力と比較して、それらがどこで分岐したかを確認できるということです。問題は、実際の出力にいくつかの行が 2 回含まれており、混乱を招くことdiff
です。簡単に比較できるように、重複を削除したいと思います。基本的にsort -u
、並べ替えなしのようなものです。
これを行うことができるUNIXコマンドラインツールはありますか?
最初にファイルuniq
を気にしない場合は、回答を補完します。sort
隣接していない行を削除する必要がある場合 (または、ファイルを再配置せずに重複を削除したい場合)、次の Perl ワンライナーでそれを行う必要があります (ここから盗まれました):
cat textfile | perl -ne '$H{$_}++ or print'
あらすじ
uniq [オプション]... [入力 [出力]]
説明
INPUT (または標準入力) から連続する同一行を 1 つを除いてすべて破棄し、OUTPUT (または標準出力) に書き込みます。
または、隣接していない重複行も削除したい場合は、この perl のフラグメントがそれを行います:
while(<>) {
print $_ if (!$seen{$_});
$seen{$_}=1;
}
これがawkの実装です。環境にperlがない/許可されていない場合(まだ見ていません)!PS:重複する行が複数ある場合、これは重複する出力を出力します。
awk '{
# Cut out the key on which duplicates are to be determined.
key = substr($0,2,14)
#If the key is not seen before, store in array,else print
if ( ! s[key] )
s[key] = 1;
else
print key;
}'
隣接する重複行を削除したい場合は、 を使用してuniq
ください。
隣接する行だけでなく、すべての重複行を削除したい場合は、より注意が必要です。
ここで回答を待っている間に思いついたのは次のとおりです(ただし、最初の(そして受け入れられた)回答は約2分で得られました)。私はこの置換を次のように使用しましたVIM
:
%s/^\(.*\)\n\1$/\1/
つまり、改行の後に以前と同じ行を探し、最初の行でキャプチャしたものだけに置き換えます。
uniq
ただし、間違いなく簡単です。