awk なら(・・ググっても、たくさん出てきますが)、
「多くは言わない。1行だけで。」 の格言?どおりに、
1行スクリプト(ワン・ライナーって言うんかな?!)で実現できるんですけど。。。
(※でも個人的には、・・
行内容そのものを連想配列の添字にしてしまうなんてのは、あんまり「美しい」とは感じません。(^_^;)汗
まぁ、動けばエエんですけど。。。)
Windows (というか、MS-DOS?ウインドウズのコマンドライン??) には、
sort は(%SystemRoot%\System32\sort.exe とかに)ありますけれど、...
なんで? uniq はないのでしょう?!(ってか、・・あんまし使う人おらへんのかな?)
ソートしたら(ソートした結果を表示したら)、つい、ユニークにしたくならないですか?!(^_^;)ゞ汗
・・話しがそれました。
ちがいます。・・実現したいのは、元のデータ(テキスト)の並び順を変えずに、uniq にしたい!んです。
awk を使いなさい!というのは、(Unix 環境では、たぶん・・)正しい答えだと思いますが、
sed がインストールされている(awk はインストールされていない!) Windows 環境下で、です。
(←自分勝手な環境下で m(_ _)m。
・・ワタシは、以下のように考えました。ゞ
1) sort 〔元ファイル〕 | sed -nf uniq-d.sed
> 〔一時ファイル〕
※〔一時ファイル〕の内容は sort|uniq -d の結果と同じ。でも Windows には uniq がありません。
2) sed -f mk_uniq.sed 〔一時ファイル〕 > ソートせず重複行削除.sed
※mk_uniq.sed:
〔一時ファイル〕を元にして、
〔元ファイル〕に対してソートせずに重複行を削除するスクリプトをつくるスクリプト。
3) sed -f ソートせず重複行削除.sed 〔元ファイル〕 > 並び変わっていないユニーク結果
さて、・・・
でも、awk と同じ結果を得ようとすると、なかなかたいへんです。。。(不可能ではないはず!!)
問題点?!は、重複している行を "どこに" 出力するのか!という点にあります。汗
awk のスクリプトと同じように、
重複している行が "はじめに" あらわれた場所で、出力しようとする・・のが「困難」の要因?です。
重複している行は、まとめて(←ww!!)、結果の最初(か最後)に出す、というのであれば、
とっても簡単になりますよね。
上記1)で作成した「一時ファイル」の内容を
重複行1 /重複行1/d
重複行2 /重複行2/d
重複行3 → /著複行3/d
・ ・
・ ・
のように、単純に「重複行全部削除.sed」にしてしまって、
最初(か最後)には、(元の)「一時ファイル」をリダイレクト追加すればイイのです。
(↑リダイレクトは「反則」だなんて言わないで!! ウインドウズで出来ればよいのであります!!)
・・・
さて、
awk と同じ結果を得られる(と思う!?汗) sed スクリプトをつくるには?!・・・
重複行1 → /^重複行1$/{ x; s/重複行1//g; tb; x; p; H; x; :b x; H; d; }
重複行2 → /^重複行2$/{ x; s/重複行2//g; tb; x; p; H; x; :b x; H; d; }
重複行3 → /^重複行3$/{ x; s/重複行3//g; tb; x; p; H; x; :b x; H; d; }
・ ・
・ ・
たぶん、・・?!。
これでうまくゆくような気がします。(^_^;)汗 ←いちおう、シロウトのワタシが考えました。。。ww
でもこれ、・・ググっても出てこないんです(ワタシの探し方が悪いのか??)。
「重複行」リテラル?!テキストを、スクリプトに埋め込んでる点が、「美しく」ないのか?「反則」なのか?
〔★簡単な説明★〕 重複行が現われたら、ホールドスペースをチェックして、
→なければ表示&ホールドスペースに追加保存。
→あれば、なにもしない(ホールドスペース追加保存状態を維持)。
・・ということのくりかえし、・・です。(^_^;)汗