- ベストアンサー
awk in csh
cshスクリプトの中で、awkと連動させたプログラムを書こうとしています。 以下の様なテーブルファイル(hoge.txt)があると想定してください。 1 0.01 0.52 3.23 ..... 2 0.22 9.34 8.22 ..... 3 0.44 0.68 3.81 ..... ... (列も行も揃っている数値だけのテーブル) 例えば、変数hogeに第2行、第2列の数値(文字列)0.22を代入する際、 シェルスクリプト内部で、 @ hoge = `awk 'NR==2' {print $2} hoge.txt` としましたが、$2をスクリプトに与えられた2番目の引数だと解釈して、 うまく動作しません。 試しに$2 -> \$2に変換してみましたが、ダメでした。 (\の後に改行がないというエラーが出ました) 第i列目,j行目の文字列を取り出すにはどのようにすれば良いでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
awkのバージョンが違うような気がします。 #gawkあたりでしょうか? 切り分けのために以下のようではどうでしょう? cat hoge.txt | awk 'NR==2' | awk '{print $2}'
その他の回答 (4)
- iriyak
- ベストアンサー率48% (40/82)
こんにちは。 FreeBSD 5.4-Release-p4 上の環境では (2, 2) のデータにアクセスできるようです。tcsh 6.13.00 ですが。 zebra[Sun]$ uname -a FreeBSD zebra.adam.ne.jp 5.4-RELEASE-p4 FreeBSD 5.4-RELEASE-p4 #0: Wed Jul 20 15:29:36 JST 2005 root@www.my.domain:/usr/src/sys/i386/compile/DEDI i386 zebra[Sun]$ `which csh` --version tcsh 6.13.00 (Astron) 2004-05-19 (i386-intel-FreeBSD) options 8b,nls,dl,al,kan,sm,rh,color,dspm,filec zebra[Sun]$ cat test.csh #!/bin/csh set x = `awk 'NR == 2 { print $2 }' input.txt` echo $x zebra[Sun]$ cat input.txt 1 0.01 0.52 3.23 ..... 2 0.22 9.34 8.22 ..... 3 0.44 0.68 3.81 ..... zebra[Sun]$ ./test.csh 0.22 zebra[Sun]$
お礼
原因がよくわからないのですが、 質問文のやり方で再度実行したところ、 なぜだかうまくいきました。。。 いろいろ教えて頂いてありがとうございました。
- Tacosan
- ベストアンサー率23% (3656/15482)
合理的なのは ・csh を使わない だと思う. スクリプトを書くなら Bourne shell の方が安全でしょう. もしくは, 状況によっては ・awk を使わない. sed+cut で逃げる というのもあり?
お礼
ご回答ありがとうございます。 色々調べているうちにわかったことなんですが、 cshでスクリプトってあまり推奨されていないんですね! Bourne Shellはcshより難しいイメージがあるので避けていたのですが これを機に勉強してみます。 sed+cutでうまくいくのかな・・・こちらも試してみます。
- localica
- ベストアンサー率52% (202/385)
No2ですが、 よく見るとcshなんですね。 私の環境では発生しないので以下の方法では如何でしょうか? #setも忘れずに ・printの代わりにprintfを使う ・-f フラグを付けて使う(スクリプトの先頭に #!/bin/csh -f という行を入れる)
- localica
- ベストアンサー率52% (202/385)
以下でどうでしょうか? @ hoge = `awk 'NR==2 {print $2}' hoge.txt`
補足
申し訳ありません、シングルクォートの場所typoです。 正しくはご指摘の通りにやっているのですが、$2変数が展開されてしまって うまくいきません。 (echo $hogeとしても空白が表示されるだけです。) #それから蛇足ですが、cshだと小数扱えないので、正しくは@ ではなくset #で文字列として抜き出すべきでした。 #(setでも結果は同じく空白なので同じだったのですが・・・)
お礼
うまくいきました! ちょっと原因は良くわからないのですが、 後日あらためて質問の方法で実行してみたところ ちゃんと2、2成分を取り出せていました・・・ 原因不明で気持ち悪い感じですが、 色々考えて下さってありがとうございました。