(txtファイルに)2行があるとしましょう。
Monday, Tuesday, Week
Tuesday, Monday, Week
これには同じ情報が含まれていますが、情報(最初の列と2番目の列)が各行で異なる順序であるため、単に使用または削除することはできませsort
んuniq
。
同じ情報を含む重複行をすべて削除するにはどうすればよいですか?
答え1
そしてperl
:
perl -lne 'print unless $seen{join ",", sort split /,\h*/}++'
答え2
ファイルに表示される行の順序を維持することを気にしない場合は、各行を標準(または正式)形式で指定し、sort / uniqまたは同様の方法を使用できます。
ファイルに表示されている順序の1つを保存することに興味があると追加したので、私が取ったアプローチは、各行を正規の順序で並べ替え、元の行と一緒に出力し、次のように表示された最初の正規化された行を並べ替えることでしたです。キーと重複キーを持つ行が削除され、次にキーが切り捨てられます。
これが最初の部分です。各ソース行の前には、行の内容の正規化された表現が追加されます。
( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data ) | awk -F":" '!_[$1]++' | cut -f2 -d: |cut -c2-
その一部を実行して、それが何をしているのかを見ることができます。最初の部分は:区切り文字を使用して正規表現(語彙順にソート)を使用して生のレコードをエクスポートします。
$ cat data
Monday, Tuesday, Week
Tuesday, Monday, Week
Tuesday, Thursday, Week
Week, Thursday, Tuesday
$ ( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data )
Monday Tuesday Week : Monday, Tuesday, Week
Monday Tuesday Week : Tuesday, Monday, Week
Thursday Tuesday Week : Tuesday, Thursday, Week
Thursday Tuesday Week : Week, Thursday, Tuesday
その後、awkを使用してキーが表示されるたびに回数を含むハッシュを構築し、「!」が含まれていないため、各キーの最初のインスタンスに暗黙の印刷が含まれます。
$ ( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data ) | awk -F":" '!_[$1]++' | cut -f2 -d: |cut -c2-
Monday, Tuesday, Week
Tuesday, Thursday, Week
答え3
トリッキーなソリューション(これは単なる例です) - 私のbashでうまくいきます。すべての行/単語を文字で分割してから、その文字を並べ替えることができます。 1行の並べ替え= 2行の並べ替えの場合は、重複した項目があります。
word1+=( $(echo "this is my life" |fold -w1) )
sortedword1=($(echo ${word1[@]} | tr " " "\n" | sort))
word2+=( $(echo "is this my life" |fold -w1) )
sortedword2=($(echo ${word1[@]} | tr " " "\n" | sort))
echo "${sortedword1[@]}"
echo "${sortedword2[@]}"
if [[ $sortedword1 == $sortedword2 ]]; then
echo "Word 1 and Word 2 are the same, delete one of them"
fi
出力:
e f h i i i l m s s t y
e f h i i i l m s s t y
Word 1 and Word 2 are the same, delete one of them