列別にファイルで重複を探す

列別にファイルで重複を探す

セミコロンで区切られ、md5ハッシュでソートされたファイルパスと、対応するmd5sumを含む入力ファイルがあります。

/media/LaCie/Images/recup2/recup_dir.1/f1295328.jpg;0080ececd3da8533f5d11e449cf73287
/media/LaCie/Documents/pics/897_FUJI/DSCF7042.JPG;0081cd15705f0c541995e13ad3e405b8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

ハッシュに基づいて重複項目を見つけて印刷する方法を知りたいです。したがって、上記入力の出力は次のようになります。

/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

試してみましたが、uniqフィールド区切り文字をスペースからセミコロンに変更する方法が見つかりません(一部のファイルパスにスペースがある可能性があります)。

ベストアンサー1

パスにスペースやセミコロンが含まれていない場合は、セミコロンをスペースに変更します。

tr ';' ' ' | uniq -f 1 -d | tr ' ' ';'

パスにスペースがあるがタブまたはセミコロンがない場合は、基本的に同じことを実行できます。ただし、一時的にスペースをセミコロンに変換し、タブをフィールド区切り文字として使用します。

tr '; ' '\t;' | uniq -f 1 -d | tr '\t;' '; '

ファイル名に対して(改行文字を含まないものを除く)仮定したくない場合は、awkにアクションを実行させることができます。

awk -F ';' '{
    if ($NF == current) {
        if (first != "") print first;
        first = "";
        print;
    } else {
        first = $0;
        current = $NF;
    }
}'

おすすめ記事