私のファイルは次のとおりです。
alice, bob
bob, cat
cat, dennis
cat, bob
dennis, alice
同じ単語を逆順に繰り返す行を削除したいです。この例では、bob, cat
とcat, 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