プロが教えるわが家の防犯対策術!

ヤマトです。

cshの文字列分割について質問します。
環境はRed Had Linux7.2です。

set DATA = hoge1;hoge2;hoge3
のデータを";"区切りでDATA_ARR(配列)に入れたいのですが、分かりません。
調べた所、[awk]と[split]を使えばできるようなのですが、
実際どのようにSHに記述していいか分かりません。
n = split(DATA,DATA_ARR,";")
をどのように記述したらよいのでしょう?

教えて頂けると有り難く思います。宜しくお願いします。

A 回答 (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/4901280 …

スクリプト言語として 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/manua …

参考URL:http://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/awk.ht …
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/01 09:35

以下のようなスクリプトを作成してください。


#!/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...です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/01 09:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A