sort せずに uniq する sed スクリプト(awk ではなく sed でね)を考えて! | 勝手に応援するブログ

勝手に応援するブログ

 
   人権侵害、性暴力、人身取引、等などがない社会になることをのぞんでいます。
 
   でも、ブログ筆者の立場は矛盾に満ちています。

awk なら(・・googleググってもサーチ、たくさん出てきますが)、

 「多くは言わない。1行だけで。」 の格言wwどおりに、

1行スクリプト(ワン・ライナーって言うんかな?!)で実現できるんですけど。。。あせ

でも個人的には、・・
 行内容そのものを連想配列の添字にしてしまうなんてのは、あんまり「美しい」とは感じません。(^_^;)あせる
 まぁ、動けばエエんですけど。。。てれ(苦笑)


WindowsWindows (というか、MS-DOSウインドウズのコマンドライン??) には、
sort は(%SystemRoot%\System32\sort.exe とかに)ありますけれど、...シラー
なんで uniq はないのでしょう?!はてなマーク(ってか、・・あんまし使う人おらへんのかな?)!?

ソートしたら(ソートした結果を表示したら)、つい、ユニークにしたくならないですか?!(^_^;)ゞあせる


・・話しがそれました。
ちがいます。ビックリマーク・・実現したいのは、元のデータ(テキスト)の並び順を変えずに、uniq にしたいんです。

awk を使いなさいというのは、(Unix 環境では、たぶん・・)正しい答えだと思いますが、
sed がインストールされている(awk はインストールされていないWindowsWindows 環境下で、です汗
自分勝手な環境下で m(_ _)mあせる


・・ワタシは、以下のように考えました。あせ汗

11) sort 〔元ファイル〕 | sed -nf uniq-d.sed > 〔一時ファイル〕
 〔一時ファイル〕の内容は sort|uniq -d の結果と同じ。でも WindowsWindows には uniq がありません。

22) sed -f mk_uniq.sed 〔一時ファイル〕 > ソートせず重複行削除.sed
 右矢印mk_uniq.sed
 〔一時ファイル〕を元にして、
 〔元ファイル〕に対してソートせずに重複行を削除するスクリプトをつくるスクリプト。目

33) sed -f ソートせず重複行削除.sed  〔元ファイル〕 > 並び変わっていないユニーク結果


さて、・・・
でも、awk と同じ結果を得ようとすると、なかなかたいへんですガーンあせる。。。(不可能ではないはず!!


問題点?!は、重複している行を "どこに" 出力するのかという点にあります。あせ

awk のスクリプトと同じように、
重複している行が "はじめに" あらわれた場所で、出力しようとする・・のが「困難」の要因です。あせあせる

重複している行は、まとめて(ww!!)、結果の最初(か最後)に出す、というのであれば、
とっても簡単になりますよね。てれ(苦笑)汗

上記1)で作成した「一時ファイル」の内容を

 重複行1      /重複行1/d
 重複行2      /重複行2/d
 重複行3     /著複行3/d

  ・           ・
  ・           ・


のように、単純に重複行全部削除.sed」にしてしまって、
最初(か最後)には、(元の)「一時ファイル」をリダイレクト追加すればイイのです。あせ
リダイレクトは「反則」だなんて言わないで!!あせあせる ウインドウズWindowsで出来ればよいのであります!!

 ・・・


さて、
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あせあせ

でもこれ、・・googleググってもサーチ出てこないんですはてなマークシラー(ワタシの探し方が悪いのか??)。はてなマーク

「重複行」リテラル?!テキストを、スクリプトに埋め込んでる点が、「美しく」ないのか?「反則」なのか


簡単な説明〕 重複行が現われたら、ホールドスペースをチェックして、
 なければ表示&ホールドスペースに追加保存。
 あれば、なにもしない(ホールドスペース追加保存状態を維持)。
・・ということのくりかえし、・・です。(^_^;)あせる