ファイルから別の順序で重複した行を削除します。

ファイルから別の順序で重複した行を削除します。

私のファイルは次のとおりです。

alice, bob
bob, cat
cat, dennis
cat, bob
dennis, alice

同じ単語を逆順に繰り返す行を削除したいです。この例では、bob, catcat, bobが繰り返されるので、cat bobを削除し、出力は次のようになります。

alice, bob
bob, cat
cat, dennis
dennis, alice

どうすればいいですか?

答え1

ソートされた要素として入力されたハッシュを使用できます。

$ perl -lne 'print unless $h{join ",", sort split /, /, $_}++' file
alice, bob
bob, cat
cat, dennis
dennis, alice

正確に2つのフィールドについては、このようなもので十分です。

$ awk -F', ' '!seen[$2 FS $1]; {seen[$0]++}' file
alice, bob
bob, cat
cat, dennis
dennis, alice

答え2

awkに対する慣用的な答えは次のとおりです。

$ awk -F', ' '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
alice, bob
bob, cat
cat, dennis
dennis, alice

フィールド数に関係なく、一般的なアプローチは、フィールドをソートし、ソートされたリストをsaw []のインデックスとして使用することです。

答え3

これにより、各行がフィールドごとにソートされ、ファイルがソートされ、一意の行のみが選択されます。

while read line
  do
    echo $line |
    tr ' ,' '\n' |
    sort |
    tr '\n' ','
done < 1 |
sed -e 's/^,//' -e 's/,$//' -e 's/,,/\n/g' |
sort -u

関連情報