- ベストアンサー
行数ごとに検索をかけて並び替えをしたいのですが・・
- データの吐き出しに成功したが、重複があり困っている。
- 区切りをつけて分ける方法がわからない。
- 教えていただける方を求めています。
- みんなの回答 (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$ -----------------------------$
その他の回答 (4)
- lunarosa
- ベストアンサー率73% (30/41)
#2 です。#2の回答内容への補足です。 …中略 for((i=1; i<$length; i++)){ echo -n "-"; } echo grep "^.*/$fn" $tmpfile >> $outputFile [ $? -eq 0 ] && drawTheLine >> $outputFile ↑ この4行に於ける先頭の空白は、全角になってます。コピペした後はすべて半角にしてください。
補足
わざわざご丁寧にありがとうございます。 VIエディタで手書きで入力したので問題はなかったのですが、実行したところ grep: Invalid regular expression と出てしまいました。 (これは以前から出ていましたが・・)
- oi_goo
- ベストアンサー率44% (20/45)
> 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)
前にご回答なされた方のスクリプトを元に追記してみました。 #!/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
補足
回答ありがとうございます。 上記でやってみたのですが、やはり同じ文字列として扱われて、重複しているものがあります。 uniqコマンドを使うしかないのでしょうか・・。
- bin-chan
- ベストアンサー率33% (1403/4213)
重複を取り除くコマンド「UNIQ」があると思うのでリファレンスを参照してみてください。
補足
回答ありがとうございます。 uniqを試みたのですが、uniqをしなくてもすむような正規表現がほしい・・・というか重複はしてないのです。 例をあげますと、 「ああああ」と「 ああああ 」は重複扱いされてしまいます。 これを正規表現で回避したいのです・・・。
お礼
「sed」というコマンドを使って何とかできました。 ご迷惑をおかけして、申し訳ございませんでした。
補足
私の説明が下手で申し訳ございません。 --元ネタファイル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」のところに入ってしまっています。 全角文字の正規表現はだめなのでしょうか・・。