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

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

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

QNo.2658731 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2658731 上記の件、解決したと思ったのですが問題が発生したので再投稿します。申し訳ございません。 こちらデータの吐き出しには成功はしたものの、重複があり困っています。正規表現の問題だとは思うのですが・・。 (空白があるものも別として数えたい) あと、分けるときに区切りをつけたいのですが、うまくいきません。 単純にエディタで区切りを記入するだけではだめなのでしょうか。 (下記のようにしたいのです・・。) /aaa/aaa.txt /sss/aaa.txt ---------------------------------- /bbb/bbb.txt /ccc/bbb.txt ---------------------------------- /yyy/ccc.txt /zzz/ccc.txt ---------------------------------- お手数ですが、お時間に余裕のある方教えていただけますでしょうか。 よろしくお願いいたします。

  • _ebi_
  • お礼率57% (8/14)

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

  • ベストアンサー
  • 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

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

    数千のファイル名が書かれたテキストファイルがあります。(Aとします。) /yyy/ccc.txt /aaa/aaa.txt /bbb/bbb.txt /sss/aaa.txt /ccc/bbb.txt /zzz/ccc.txt ・ ・ ・ ユニークファイル名だけ書かれたファイルがあります。(Bとします。) aaa.txt bbb.txt ccc.txt ・ ・ ・ Bの行数1行ずつAで検索をかけ、ファイル名を新しいファイル(Cとします)に書き出したいのです。 /aaa/aaa.txt /sss/aaa.txt /bbb/bbb.txt /ccc/bbb.txt /yyy/ccc.txt /zzz/ccc.txt ・ ・ ・ シェルを使ってやりたいのですが、どのようにすればいいのか見当もつきません。 どなたかお分かりのかたいましたら教えてください。よろしくおねがいします。

  • 要素名を表示させたい

    <data>   <aaa xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </aaa>   <bbb xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </bbb>   <ccc xxx="0">     <yyy zzz="1"/>     <yyy zzz="2"/>   </ccc> </data> 上のようなXMLから、XSLのvalue-ofなどを使って、 要素名aaa、bbb、cccを表示させるにはどう記述すればいいのでしょうか?

    • ベストアンサー
    • XML
  • 1つのセルに複数のハイパーリンク(改)

    二重投稿申し訳ありません。 あせり過ぎてて、アプリ名書き忘れてました エクセル2003で1つのセルに複数のハイパーリンクを設定することは可能でしょうか? たとえば、1つのセルに AAA,BBB,CCCと表示されていて AAAをクリックしたらhttp:xxxへ BBBをクリックしたらhttp:yyyへ CCCをクリックしたらhttp:zzzへと言った様に

  • ファイルから検索条件を読み込んでGREPを実行したい

    INPUTファイルを以下のように作成します。 >input.txt aaa bbb ccc ・ ・ ・ 特定のディレクトリの複数ファイルに対して grepを順にaaa,bbb,ccc・・・ というようにinput.txtから読み込んで実行し、結果をそれぞれaaa.txt,bbb.txt,ccc.txt・・・ へ出力したいのですが、方法がわからなくて困っています。 どなたかご教授お願いいたします。

    • ベストアンサー
    • Perl
  • 列値の分割の方法

    ご存知でしたら、教えてください。 列値に、任意のカンマ区切りの文字列がある時(コードと名称)、 それを2つの列に分解(コード列と名称列)して出力する方法がありましたら、教えてください。 例) INPUTテーブル FLD1 1:AAA,2:BBB,3:CCC 1A:XXX,2A:YYY,3A:ZZZ ↓ OUTPUTテーブル FLD1 FLD2 1,2,3 AAA,BBB,CCC 1A,2A,3A XXX,YYY,ZZZ よろしくお願いします。

  • powershellのファイル名が同一検索

    とある同一フォルダ内に ファイル名 AAA-bbb.txt AAA-ccc.txt 等のファイルがあります。 AAAをキーとして、更新日時が最新の分を 読み込みたいと考えています。 どのように行えばいいのでしょうか。 よろしくお願いいたします

  • perl について

    http://AAA/BBB/???/CCC AAAとCCCは固定文字です。 BBBは変化します。 ///の数・順番も固定です。 この状態で、「???」を抜き出してZZZ変数に値を代入するにはどうすれば良いでしょうか? ZZZ=

    • ベストアンサー
    • Perl
  • system関数と引数について

    環境 Windows XP VC++6.0, Win32consoleです。 以下のファイルを連続処理させたいのですが、  aaa1.txt、aaa2.txt、aaa3.txt、~~~~aaa.15.txt  bbb1.txt、bbb2.txt、bbb3.txt、~~~~bbb.15.txt  ccc1.txt、ccc2.txt、ccc3.txt、~~~~ccc.15.txt その際、perlで処理させたいと考えております。 VC++ から system関数を用いてperlファイルを動かそうとしていますが、 たとえば、この時 aaa や bbb や ccc を引数として渡せるのでしょうか?

  • awkで二つのファイルを比較し出力する方法

    UNIXで二つのファイルを使って別ファイルを出力する 処理をしたいのですが、awkで二つのファイルを扱う方法 が分かりませんでした。 やりたい処理は以下のような事です。 ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、 ファイルBの次の行"YYY bbb"を挟み込みます。 もし、ファイルBに同じ行がなかったら、 ファイルAの次の行に"NG"を挟み込みます。 [ファイルA] AAA B ZZZ B AAA C ZZZ C AAA D ZZZ D [ファイルB] AAA B YYY bbb AAA C YYY bbb [出力ファイル] AAA B YYY bbb ZZZ B AAA C YYY ccc ZZZ C AAA D NG どなたか良いスクリプトありましたら 教えていただけないでしょうか。 よろしくお願いします。

  • シェルスクリプトにてファイルの結合

    お世話になります。 ある3つのファイルfile1 file2 file3 の内容が file1が 111 222 333 file2が aaa ddd bbb eee ccc fff file3が xxx yyy zzz という内容を file4に 111 aaa ddd xxx 222 bbb eee yyy 333 ccc fff zzz という具合に横に結合させて出力させたいのですが どうしていいか分かりません。 sedとかawkを使えばいけそうなんですが 分かる方いらっしゃいませんか??? 宜しくお願いいたします。