• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:行数ごとに検索をかけて並び替えをしたいのですが・・(再投稿です))

行数ごとに検索をかけて並び替えをしたいのですが・・

このQ&Aのポイント
  • データの吐き出しに成功したが、重複があり困っている。
  • 区切りをつけて分ける方法がわからない。
  • 教えていただける方を求めています。

質問者が選んだベストアンサー

  • ベストアンサー
  • lunarosa
  • ベストアンサー率73% (30/41)
回答No.5

#2,4 です。 >こちらデータの吐き出しには成功はしたものの、重複があり困っています。正規表現の問題だとは思うのですが・・。(空白があるものも別として数えたい) >uniqを試みたのですが、uniqをしなくてもすむような正規表現がほしい・・・というか重複はしてないのです。 >「ああああ」と「 ああああ 」は重複扱いされてしまいます。 > これを正規表現で回避したいのです・・・。 すみません。これまでのご質問内容を拝見しますに、 ●"何が重複している" のか、"何が重複していない" のかが今ひとつ見えないのですが... ●(空白があるものも別として数えたい)⇒ 私としては、「スペース1個でも差異があれば、それは別物として扱いたい」という認識です。要は、出力ファイルの内容は、完全に一意のラインのみにしたい、ということですよね?。 grep の regex に構文ミス(スクリプトの前後関係も含めて)があるようですから、もう一度見直してください(この場合、敢えて正規表現を使わなくてもシンプルに "$fn" でも問題ないと思います)。 私の環境で試して見ましたが、下のように uniq なラインが出力されます。 質問者様の意図は、この目的とは違うのでしょうか? スクリプト中の sort -u 元ネタファイル<Enter> または sort 元ネタファイル | uniq<Enter> だけで確認しても一意性を持った出力が得られます。その中から単に grep で引っ掛けるだけなので、重複行は存在しないはずなんですが...。    --元ネタファイル A -- <sp><sp>/aaa/aaa.txt <sp>/aaa/aaa.txt <全>/aaa/aaa.txt /aaa/aaa.txt /aaa/aaa.txt /aaa/aaa.txt<sp> /aaa/bbb.txt 注:<sp>は半角スペース、<全>は全角スペース --検索キーワード ファイル B -- aaa.txt bbb.txt -- 結果ファイル -- cat -etv 出力ファイル<Enter> <sp><sp>/aaa/aaa.txt$ <sp>/aaa/aaa.txt$ /aaa/aaa.txt$ /aaa/aaa.txt $ M-!M-!/aaa/aaa.txt$ -----------------------------$ /bbb/bbb.txt$ -----------------------------$

_ebi_
質問者

お礼

「sed」というコマンドを使って何とかできました。 ご迷惑をおかけして、申し訳ございませんでした。

_ebi_
質問者

補足

私の説明が下手で申し訳ございません。 --元ネタファイルA-- aaa/aaa.txt aaa/bbb.txt ccc/aaa.txt eee/コピー ~ aaa.txt ccc/bbb.txt --検索キーワード ファイルB-- aaa.txt bbb.txt コピー ~ aaa.txt Bを使ってAに検索をかけて、下記のようにデータを書き出したいのです。 -- 結果ファイル -- aaa/aaa.txt ccc/aaa.txt --------------------- ccc/bbb.txt aaa/bbb.txt --------------------- eee/コピー ~ aaa.txt そして今悩んでいるのが一番下のファイル名で、半角スペース・全角文字が混ざっています。 デバッグしてみたところ、「コピー」、「 ~ 」、「aaa.txt」と分けられてしまってます。 結果、「aaa.txt」のところに入ってしまっています。 全角文字の正規表現はだめなのでしょうか・・。

その他の回答 (4)

  • lunarosa
  • ベストアンサー率73% (30/41)
回答No.4

#2 です。#2の回答内容への補足です。 …中略   for((i=1; i<$length; i++)){ echo -n "-"; }   echo   grep "^.*/$fn" $tmpfile >> $outputFile   [ $? -eq 0 ] && drawTheLine >> $outputFile ↑ この4行に於ける先頭の空白は、全角になってます。コピペした後はすべて半角にしてください。

_ebi_
質問者

補足

わざわざご丁寧にありがとうございます。 VIエディタで手書きで入力したので問題はなかったのですが、実行したところ grep: Invalid regular expression と出てしまいました。 (これは以前から出ていましたが・・)

  • oi_goo
  • ベストアンサー率44% (20/45)
回答No.3

> QNo.2658731 ​http://oshiete1.goo.ne.jp/kotaeru.php3?q=2658731 # uniq A > AA # grep -f B AA 今回本題. B を1行ずつファイル入力&検索させ,検索結果とecho "区切り文字"出力,の処理を回す. # 今日はもうダメ….

  • lunarosa
  • ベストアンサー率73% (30/41)
回答No.2

前にご回答なされた方のスクリプトを元に追記してみました。 #!/bin/sh LANG=C # Environment. sourceFile=A        # 元ネタファイルのパス keywordFile=B       # 検索キーワード入りファイルのパス outputFile=file.uniq    # 出力先ファイルのパス tmpfile=tmp        # 一時出力用ファイルのパス length=30 # function. drawTheLine(){   for((i=1; i<$length; i++)){ echo -n "-"; }   echo } # Run. sort -u $sourceFile > $tmpfile : > $outputFile for fn in `cat $keywordFile` do   grep "^.*/$fn" $tmpfile >> $outputFile   [ $? -eq 0 ] && drawTheLine >> $outputFile done rm $tmpfile

_ebi_
質問者

補足

回答ありがとうございます。 上記でやってみたのですが、やはり同じ文字列として扱われて、重複しているものがあります。 uniqコマンドを使うしかないのでしょうか・・。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

重複を取り除くコマンド「UNIQ」があると思うのでリファレンスを参照してみてください。

_ebi_
質問者

補足

回答ありがとうございます。 uniqを試みたのですが、uniqをしなくてもすむような正規表現がほしい・・・というか重複はしてないのです。 例をあげますと、 「ああああ」と「 ああああ 」は重複扱いされてしまいます。 これを正規表現で回避したいのです・・・。

関連するQ&A