• ベストアンサー

文字列を複数行の先頭にいれたいです。

下記のようなテキストファイル(氏名の下は不特定数行)があります。 山田 hogehoge hogehoge hogehoge hogehoge 田中 hogehoge hogehoge 鈴木 hogehoge これを下記のようなテキストに変換したいのですがsedとかでできないでしょうか?sedは使える環境です。よろしくお願いいたします。 山田hogehoge 山田hogehoge 山田hogehoge 山田hogehoge 田中hogehoge 田中hogehoge 鈴木hogehoge

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「awk とか perl」と書いておきながら awk は使えないので perl. perl だともう普通のプログラム言語なので, もっと簡単に my $name; while (my $line = <>) { # 1行読み込んで chomp; #念の為行末の改行を消して if ($line が氏名だったら) { $name = $line; #氏名を記憶する } else { print "$name$line\n"; #氏名と現在の行をまとめて表示 } } で終わり.

jjpochi
質問者

お礼

ありがとうございました。perlがやっぱりわからなかったのでなんとなく見た感じシェルスクリプトでsedで氏名を抜き出して氏名でなかった場合はecho $name$lineでwhile do done($iはwc -lで全部の行数を取得して)しました。条件文が氏名が入るので多人数の場合は考えます。また、作ってから気がついたのですが、lineの行頭は数字立ったので^[0-9]で判別できたかなとも思ってます。本当に参考になりました。大変感謝してます。私はこの三日なにをやっていたのかと反省しております。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

氏名の行が重複していたり、hogehoge の中に氏名が含まれているとうまく動きません。 氏名はリストアップしているだけですが、氏名の行を特定できるものがあれば置き換える ことができると思います。 /山田\|田中\|鈴木/ { h N s/^.*\n// } H g s/\n// x s/\n.*$// x

jjpochi
質問者

お礼

ありがとうございました。bashでできました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

次の 2つの条件がともに満たされれば, パターンスペースとホールドスペースを駆使してなんとかなりそうな気がします: 1.「氏名」と「氏名でないもの」の区別ができる 2.「氏名」と「氏名でないもの」のどちらにも含まれない文字 (以下「区切文字とする」) が存在する. つまり, 「氏名」を読み込んだときにホールドスペースにコピー (h) し, あとは「氏名でないもの」の間 1. パターンスペースとホールドスペースの交換 (x) 2. パターンスペースに区切文字を追加 (a) 3. パターンスペースにホールドスペースを追加 (G) 4. 区切文字を使って氏名と氏名でないものを入れ替え (s) とやればできるかもしれません. s で入れ替えるときの区切として改行文字 ('\n') を使えるなら, 上の2の条件は不要です. .... ん~, 多分 sed じゃなくて awk とか perl の方が簡単だと思うなぁ....

jjpochi
質問者

お礼

こんなに早くレスが付くなんて....感謝です。 一応、環境はCentOS5.1なんでsed(以外知らないです。)以外でも、端末で動けばなんでも良いです。自分でもこれができれば便利だなと思いついて三日立ちますが元のデータから氏名と報告を抜き出すのが精一杯でこれだと誰の報告かわからないので頭に氏名が入ればなと思った次第です。 ほんとに考えてくださってありがとうございます。

関連するQ&A