- ベストアンサー
UNIXのuniqコマンドで重複カウントがまとまらない理由と解決方法
- UNIXのuniqコマンドを使用して重複カウントを行いたい場合、一部の行がまとまらないことがあります。これは、行全体が重複しているわけではなく、一部の要素が異なるためです。
- 具体的には、日付や名前の一部が異なる場合に行がまとまらないことがあります。uniqコマンドは、行全体を比較して重複を判定するため、一部の要素が異なると重複と判定されず、別々の行として扱われます。
- この問題を解決するためには、事前にソートコマンドを使用して行をソートしておく必要があります。uniqコマンドは連続する行が重複している場合にのみ動作するため、ソートされた行を入力として与えることで正しい結果が得られます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
uniqの使い方は合ってると思います。 3行目と4行目は本当に同じですか?よく見てください。 例えば、スペースが余分に付いているとか、TABとスペースが混在しているとか なにか見えにくいところで違いはありませんか? /tmp$ sort aaa | uniq -c 10 2012/01/01 あいう 1 2012/01/01 かきく 2 2012/01/02 あいうえ 3 2012/01/02 かきく /tmp$ 手元で同様のデータを作って試すと、このように正しく表示できています。 データ側に問題があると思って間違いないと思いますよ。
その他の回答 (3)
- ky072
- ベストアンサー率60% (85/140)
他の方が回答しているように、 目に見えない違いがあることが原因だと思います。 改行コードや空白が混入している可能性が高いです。 他には、エンコードが ISO-2022-JP で、 冗長なエスケープシーケンスが原因の可能性もあります。 % sort aaa | uniq | head -3 | tail -1 | od -An -tx1 % sort aaa | uniq | head -4 | tail -1 | od -An -tx1 または % head -3 bbb | tail -1 | od -An -tx1 % head -4 bbb | tail -1 | od -An -tx1 のようにしてデータの違いを見てみて下さい。
お礼
再度、チェック方式を教えてくださり、ありがとうございました。
補足
試してみましたが、同じ結果でした。 コマンドの問題ではないということですので、少し データの生成方法を見直してみたいと思います。
- jjk65536
- ベストアンサー率59% (66/111)
連投すんません。 改行コード混ざってませんか? 改行コード混在(0x0aの行と0x0d0aの行の混在)のテキストを作ってテストしたところ 以下のように質問者様と同じような問題が再現できました。 /tmp$ sort aaa | uniq -c 4 2011/01/01 hoge 1 2011/01/01 hoge これが原因だとすると、改行コードの種別が識別できるテキストエディタで確認する 必要がありますね。 geditとかでaaaを開いてaaa2として保存し、それにsortとuniqしたところ 問題が発生しなくなりました。 同じだといいのですが...
お礼
geditとかでaaaを開いてaaa2として保存という形で試してみます。
補足
改行コードは \nで 統一されておりますので、 問題ないと思います。
- jjk65536
- ベストアンサー率59% (66/111)
bbbであれば 1 2012/01/02<tab>あいうえ 1 2012/01/02<tab>あいうえ の部分がどこか違うはずです。 再現できるテキストファイルをどこかにアップしていただければこちらでも調査できます。 ここにコピペすると、その時点で書式がくずれちゃうのでコピペだめです。
お礼
調査まで考えていただき、ありがとうございます。 再現ファイルの取り出しができない状況のため、お渡しはできないのですが、解読できないごみを取り除く方法を検討し、クレンジングをまずは試みてみます。
お礼
さっそくの回答ありがとうございます。
補足
データに違いがあるかと思って、(bbbファイルしかチェックしていないのですが)結果ファイルをみても、どこもおかしいところが見当たらないのです。元のaaaファイルでチェックしないとだめなのでしょうか?