|
シェルで、2行を1行にする方法につてい教えてください。 cat file.txt dn: nm=yamada.taro,o=tokyo,o=test. co.jp nm: nm=yamada.taro o: o=tokyo o: o=test.co.jp dn: nm=yamada.hanako,o=oosaka,o=test. co.jp nm: nm=yamada.hanako o: o=oosaka o: o=test.co.jp を dn: nm=yamada.taro,o=tokyo,o=test.co.jp nm: nm=yamada.taro o: o=tokyo o: o=test.co.jp dn: nm=yamada.hanako,o=oosaka,o=test.co.jp nm: nm=yamada.hanako o: o=oosaka o: o=test.co.jp のようにしたいのですがどうすればいいのですか。 改行となっている次の行の頭は、半角スペースで始まっています。 また、空白行を消したくないのです。 空白行までを、1ブロック(かたまり)として扱いたいのです。 環境 Solaris8 Bシェル |
|
>>4460 mkt > ・fgrep と Gimp の解説文が途中で切れてしまっているように > 思います。 ありがとうございます。Gimp は「Gimp の開発中にできたのが Gtk」、fgrep に ついては「"Fast GREP" は違うでしょ」と書こうとして、そのままになってしまい ました。とりあえず今晩書きかけの部分を削除したいと思います。 > ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が > 抜け落ちてしまってます。 これは HTML 生成スクリプトの修正が必要ですので、少し時間がかかります。 fgrep についてメモ。オリジナル版には "Fast GREP" または "Fixed string GREP" の略。 とありますが、 http://www.nurs.or.jp/~asada/FAQ/UNIX/section1.3.html fgrep は、長さが決まっている文字列を検索します。"f" は "fast" という意味では ありません。事実、"fgrep footbar *c" の速さは、普通、"egrep footbar *.c" の 速さより遅いのです http://www.bsddiary.net/doc/hierarchy.txt 熟練者: 誰かが速いと言ったのでfgrepを使っている ハッカー: 自分で時間を測った結果egrepを使うことにした などの他の有名な文献と矛盾しています。 http://minnie.tuhs.org/TUHS/archive_sites.html を見ると fgrep・egrep が現れたのが V7 で、V7 と 2.10 BSD のソースはほぼ 同じでした (ソースは別)。4.4BSD Lite2 では grep・fgrep・egrep のソースが 一本化されていました。それをふまえた上で man の記述を見ると、 V7: Fgrep patterns are fixed strings; it is fast and compact. http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html 2.10 BSD: Fgrep patterns are fixed strings; it is fast and compact. http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=2.10+BSD&format=html 4.4BSD Lite2: The fgrep utility is quick but can handle only fixed strings http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=4.4BSD+Lite2&format=html FreeBSD 1.0〜6.0: Fgrep is the same as grep -F. http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=FreeBSD+1.0-RELEASE&format=html SunOS 4.1.3: In general, egrep is the fastest of these programs. http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=SunOS+4.1.3&format=html というわけで、fgrep が "Fast GREP" であるという認識があったとすれば、古代の man の "fast" という記述が原因ではないかと考えます。 あとは、この時代の fgrep が grep・egrep と比べて fast であるかが気になる ところですが、これは調査する時間と力量がないのでパスということで。 参考: http://groups.google.co.jp/group/fj.questions.unix/browse_thread/thread/e8ea37b4d0dd6372/235ce238f717f19c http://katsu.watanabe.name/grep/efgrep.html http://katsu.watanabe.name/grep/ohpcontents.html オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを いれるわけにもいかず、なかなか大変です。 > この掲示板の [使い方] ページにある「敬省略」っていうのも気になります… これまで思いっきり「敬省略」だと思っておりましたが、「敬称略」だったのですね。 ひとつ賢くなれました。これも今晩修正予定です。 >>4461 mkt 全角入りソースをコピペしやすいよう、半角空白に置換しています。 |
|
>>4451 68user 返事送れて申し訳ありません。 Solarisで動きました。 |
|
>>4462 お sed で何とかできるのかもしれませんが、わたしは sed をよく知らないので、 sh でやるならこんな感じで。 IFS='' buf='' use_buf=0 cat file.txt | while read -r line; do case $line in " "*) tmpline=`echo -n $line|sed 's/^ *//g'` buf="$buf$tmpline" use_buf=1 ;; *) if [ "$use_buf" = "1" ]; then echo "$buf" fi buf="$line" use_buf=1 ;; esac done if [ "$use_buf" = "1" ]; then echo "$buf" fi と思ったのですが、最終行が出ません。sh もよくわかってないわたしには解決 できませんでした (GNU bash, version 3.00.14(1)-release (i386-redhat-linux-gnu))。 perl を使ってよいなら perl -e 'undef $/; while (<>){s/\n +//g; print}' file.txt あたりで。 |
|
>>4465 68user > と思ったのですが、最終行が出ません。 あー、ループ部分がサブシェルになってるからか。 while read -r line; do ... done < file.txt なら OK ですね。 やはり sh でプログラムなんて書くもんじゃないと思う。誰か Sh Programming Considered Harmful を書いてください。 |
|
>>4466 68user 補足。Solaris の sh では > while read -r line; do > done < file.txt でもダメなようですね。 http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936 |
|
>> 4467 ありがとうございます。 > while read -r line; do > done < file.txt はやはりダメでした。 while read line; do done < file.txt としたら上手く動きました。 また、 tmpline=`echo -n $line|sed 's/^ *//g'` では、1行になるのですが、「-n」オプションが邪魔みたいで、上手く編集 できませんでした。 tmpline=`echo $line|sed 's/^ *//g'` としたら上手くいきました。 |
|
>> 4468 sed 一発で簡単にできるものなのでしょうか。 |
|
>>4469 お 完璧ではないですが、こんな感じで。 ------ sed -e '/^[^ ]\{1,\}/ { N } s/^\([^ ]\{1,\}.*\)\n \{1,\}\([^ ]\{1,\}\)/\1\2/g' file.txt ------ >>4468 お >while read line; do >done < file.txt >としたら上手く動きました。 これだけで動きますか? whileの前に exec 0<file.txt とか要りませんでしたっけ? >>4466 68user >やはり sh でプログラムなんて書くもんじゃないと思う。誰か > Sh Programming Considered Harmful >を書いてください。 私は、どの程度の事までをシェルスクリプトでやるべきか悩みます。 Perlとか使った方が絶対に効率が良かったりするのに、 何故かシェルスクリプトにこだわる人とかいるし・・・ (で、気がつくと自分以外に判らないスクリプトが出来上がっていると。) |