• ベストアンサー

cshで文字列分割

ヤマトです。 cshの文字列分割について質問します。 環境はRed Had Linux7.2です。 set DATA = hoge1;hoge2;hoge3 のデータを";"区切りでDATA_ARR(配列)に入れたいのですが、分かりません。 調べた所、[awk]と[split]を使えばできるようなのですが、 実際どのようにSHに記述していいか分かりません。 n = split(DATA,DATA_ARR,";") をどのように記述したらよいのでしょう? 教えて頂けると有り難く思います。宜しくお願いします。

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

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんにちは、ヤマトさん。 csh の配列というのは、例えば DATA が「foo;bar;baz」であったとき、 DATA_ARR には「foo bar baz」という値を入れたいということでいいでしょうか。 split を使えばこのようになりますか。最後には Control-D を押す必要があります。 この例では split の結果は配列 A の中に格納されます。 「DATA=$DATA」はシェル変数 DATA の値を AWK で用いる変数 DATA に代入するという意味です。 set DATA_ARR=`awk 'END{split(DATA,A,";");print A[1],A[2],A[3]}' DATA=$DATA` split を使わない別解として、標準入力を用い set DATA_ARR=`echo $DATA | awk 'BEGIN{FS=";"}{print $1, $2, $3}'` とも書けます。こちらは C-d は不要です。 BEGIN 節の中の「FS」とはフィールド区切り文字(field separator)の意味で、 AWK は $0 をこの値によって自動的に split してくれます。 なお、FS については BEGIN 節の中で記述せず、 「-F\;」のようにAWK へのオプションとしても指定できます。 (「;」をエスケープしていることにご注意) 「OFS」という出力フィールド区切り文字(output FS)もあり、 print などの出力はこれを挟んで表示されます。 初期値はスペースで、上記の例でもこの初期値を利用しています。 結果は「echo $DATA_ARR[1]」などとしてご確認ください。 独習されているようですので、いい参考書が必要でしょう。 「LINUX クイックリファレンス(第2版)」(オライリー・ジャパン)がお勧めです。 この1冊の中に各種シェルや awk, perl、GNU コマンドなどが要領よく解説されています。 お値段は高めですが、それだけの値打ちはあると信じます。 http://www.oreilly.co.jp/BOOK/linuxnut2/ AWK の参考書としては同じくオライリー・ジャパンの「sed&awk プログラミング 改訂版」 (Dougherty, Robbins 共著、福崎 俊博訳)か、 「プログラミング言語 AWK」(エイホ・カーニハン・ワインバーガー共著、 足立高徳訳/シイエム・シイ)がいいでしょう。 ちなみに「AWK」の名前の由来はこの三人 Aho, Weinberger, Kernighan の 頭文字を取ったものです。 http://www.oreilly.co.jp/BOOK/sedawk/ http://www.amazon.co.jp/exec/obidos/ASIN/4901280406/ref%3Dase%5Fseshopcom-22/250-8600902-9060234 スクリプト言語として AWK もいいのですが、基本的にフィルタ言語ですから 制御構造が標準入力を読み込むためのループに縛られる傾向があります。 今から学ぶとしたら、Ruby や Perl または Python の方がよりやり甲斐があると思います。 特に私の好きな Ruby ではこのように書けます。 ruby -e "print '$DATA'.split(/;/).join(' ')" (ba)sh においては以下のようにしてください。 ruby -e "print \"$DATA\".split(/;/).join(' ')" join は split の逆で、配列要素を区切り文字で挟んだ文字列を返します。 split の括弧の中身がシンプルなのがおわかりでしょうか。 左から右へすんなりと処理が進んでいくのは、 Ruby の「オブジェクト指向」の御利益なのです。 http://www.ruby-lang.org/ja/ http://www15.web24.jp/~c01763n1/rubytips/ 最後にちょっとお節介。 csh を使ってみて、やっぱり込み入った引用符の処理が (ba)sh に比べて洗練されていないと感じました。 最後の Ruby の実行例でも、''で囲まれて展開されないはずの $DATA が 実際には展開されたり、エスケープしたはずの「"」が 実際にはされなくてエラーになったりしました。 bash ではちゃんと思い通りの結果が得られます。 シェルスクリプト言語としては、sh をお使いになった方が リダイレクションなどいろいろと楽だと思います。 http://faqs.jmas.co.jp/FAQs/csh-whynot-jp bash でもバージョン2から配列が使えるようになっています。 表記は「${DATA_ARR[1]}」のようになります。あ、「man gawk」も忘れずに。 http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/

参考URL:
http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/awk.html,http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_toc.html
jyamato
質問者

お礼

nightowlさん 有難う御座いました。 詳しく説明してくださり助かります。 色々勉強になりました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

以下のようなスクリプトを作成してください。 #!/bin/csh set DATA = "data1;data2;data3;data4" set DATA_ARR = `echo $DATA | awk '{n=split($0,arr,";") ;for (i=1;i<=n;i++) print arr[i]}'` echo "DATA=$DATA" foreach i ($DATA_ARR) echo $i end 実際に必要なのは3行目のset DATA_ARR...です。

jyamato
質問者

お礼

tatsu99さん 有難う御座いました。 できました!

すると、全ての回答が全文表示されます。

専門家に質問してみよう