RedHatのシェルスクリプトでファイルの読み込みとデータの分割について悩んでいます

このQ&Aのポイント
  • RedHat7.0でシェルスクリプトを作成している初心者です。ファイルの読み込みとデータの分割について悩んでいます。実行場所の指定とデータの区切り方がうまくいきません。
  • 実行場所が/tmpであるため、ファイルのパスの指定がうまくできずにエラーが発生しています。ファイルのパス指定についてアドバイスをいただきたいです。
  • データが空白区切りの場合はうまく処理できますが、カンマ区切りの場合はうまくデータを分割できません。-dオプションを使ってデータの区切り方を指定する方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

RedHatのシェルスクリプトで・・・・

こんにちは。何度もすみません。また質問させて下さい。 RedHat7.0でシェルスクリプトを作成しているのですが、 初心者の為(Linux自体よくわかってません)悪戦苦闘中です。 今回つまづいたのは、 #!/bin/bash FName=/home/my/aaa.txt read str1 str2 str3 <$FName とした時、まず、実行している場所が /tmp な為、FNameに/home/myとやるとファイルがありません、 と言われてしまいます。 ../home/myでもだめなんですね~・・・どうしてでしょう・・・。 もうひとつ、 aaa.txtの中身に記述されているデータが、空白区切りの時は うまくstr1 str2 str3に値が入ってくれるのですが、 カンマ区切りデータが入っていると値が入ってくれません。 自分なりに調べて-dを使うと出来るっぽい所までは わかったのですが、具体的な使い方がいまいちわからないのです。 read str1 str2 str3 <$FName -d, なんて書いてみたのですが・・・全然だめのようです。 なかなか良いサンプルコードが見つからなくて・・・。 すみませんが、アドバイスいただけたら、と思います。 宜しくお願いいたします。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

またお会いしましたね。では、早速。 > FNameに/home/myとやるとファイルがありません フルパスで書いているのですから、実行している位置には関係ないです。 怪しいのは、読み込もうとしているファイル周りの権限。 /home/my/aaa.txt から中身を読み込む為には、実行ユーザが ・aaa.txt に対して読み込み権限を持っていること ・/home 及び /home/my ディレクトリに実行権限を持っていること が必要です。 > カンマ区切りデータが入っていると値が入ってくれません これについては、こんな感じでできます。 IFS=, read str1 str2 str3 < $FName bash の man でシェル変数のところに記述がありますので、詳細はそちらを どうぞ。 > なかなか良いサンプルコードが見つからなくて・・・ 一番のお手本は、起動スクリプトですよ。/etc/rc0.d とかの下にあるやつ。 絶対動くって保証もあるし。

bunnyLove
質問者

お礼

a-kumaさんおはようございます。回答ありがとうございます。 今教えていただいた通りやってみたら動きました! なるほど、ディレクトリに実行権限が無いとだめなんですね~~ 難しいです~~。 カンマ区切りのも無事できました。 manは、読んでも難しくてさっぱりわからないんですよね・・・。 でもがんばって読んで勉強します。 今回のスクリプトはとりあえずこれで動きそうです。 本当に助かりました。どうもありがとうございます。 なるほど、起動スクリプトですか・・・ ああいうのをさらっと書けるようになるといいんですけど。。 かんばります!!

関連するQ&A

  • RedHatでのシェルスクリプトについて

    こんにちは。また質問させて下さい。 redhat7.0のシェルスクリプトで、 サンプルコード片手に以下のコードを記述しました。 やりたい事は、もしaaa.txtというファイルが存在したら その内容を表示させ、存在しなければその旨のメッセージを 表示させる、という単純なものです。 この時、ファイルが存在しない時に ./test.sh: /tmp/aaa.txt: No such file or directry というエラーになってしまいます。 エラーを抜けてメッセージを表示させるには どうしたらいいでしょうか。 アドバイスよろしくお願いいたします。 *********記述したコードです。************* #!/bin/bash fileName=/tmp/aaa.txt read varStr1 varStr2 <fileName if [ -a fileName ]; then echo {$varStr1} else echo{$fileName}{$varStr2} fi

  • シェルスクリプト

    2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file

  • phpで作成したファイルをシェルで読み込むと最後の行を読み込めない

    phpでリストを取得し、ファイルに書き込んでいます。 リストはスペース区切りで帰ってくるので、改行コードに変換しています。 $str = "a b c"; $str =str_replace(" ","\n",$str); //リストファイルへ書き込み $pointer=fopen("aaa.txt","w"); flock($pointer, LOCK_EX); fputs($pointer, $str); flock($pointer, LOCK_UN); fclose($pointer); これをviで開いてみると a b c と予定通り書き込まれています。 このリストをシェルスクリプトでループして読み込んでいるのですが 最後の行を読み込んでくれません。 while read line do echo "$line" done < aaa.txt とやると 最後の行が読み込まれないんです!(aとbしか表示されない) ちなみに、aaa.txtをviで開いて何もせずに保存終了すると 正常に最後の行が表示されることから、aaa.txtの終了コードがうまく 書き込まれていないのでは?と予想していますが、よくわかっていません。 どうしたら最後の行を読んでくれるのでしょうか。 ※最後の行に改行コードをつけると次の空白行を読みにいってエラーになるのでそれ以外でお願いします。

    • 締切済み
    • PHP
  • RedHatのShellScriptについて

    初めて投稿します。よろしくお願いします。 RedHat7.0でShellScriptを作成しています。 初めて作るのでよくわかっていません。 下記スクリプトを実行すると、 ./test.sh:aaa:command not found とエラーになります。 原因がおわかりの方、アドバイスをいただけないでしょうか。 よろしくお願いいたします。 ******test.shの内容***************** #!/bin/bash . /tmp/test.txt para=$1 export para echo $para ************************************ ***test.txtの内容******************* aaa *********************************** ********やりたい事***************** 変数paraにtest.txtに定義されている値を 代入して表示したい。 ********************************** 権限はどちらのファイルも chmod 777 test.sh chmod 777 test.txt に設定してあります。 回答よろしくお願いいたします。

  • シェル関数引数のスペース文字列をgrepに

    下記のシェル関数 arg_space() 内で、grepを使いたいのですが。 'aaa bbb' などのスペースを含む文字列を引数として渡すとスペース後の文字列がファイル名と 認識されてしまいます。 -- arg_space.sh -- #!/bin/bash CHK_STR='aaa bbb' FILE_NAME='data/aaa.txt' function arg_space() { return `grep -c $1 $2` } arg_space $CHK_STR $FILE_NAME if [ $? -ge 1 ]; then echo 'Match !!' else echo 'No match.' fi exit 0 ------------------ ]# ./arg_space.sh grep: bbb: No such file or directory Match !! スペース文字を、grep に区切り文字として認識させないようにする 方法を教えて 頂けないでしょうか。 -- data/aaa.txt -- aaa bbb ccc ddd ---------------

  • perlで以下の動作が出来る機能を作っています。

    perlで以下の動作が出来る機能を作っています。 1.ファイル名が載っているfname.txtを読み込む。 2.読み込んだファイル名を開く。 3.ファイルの内容を変換。 4.変換したファイル内容をnew_fileディレクトリに保存。※ファイル名はそのまま。 1~4までを作ったのですが、fname.txtで指定した全てのファイル名を変換して保存したいのに、一番最初に記載されてあるファイル名しか置換されません。書籍などで調べてもわからないのと今日中に製作したいのでここで質問しました。 ご教授お願いします。 以下にソースを貼ります。 #!/usr/local/bin/perl -w use strict; my $x = 0; my $y = 0; my $z = 0; open(IN,"<"."fname.txt")or die "cannot open txt_file: $!";#fname.txtを開く while(<IN>){ #chomp $_;#改行してファイル名を書き込んでいるので、改行を消去 my $fn = $_; my @F = $fn; foreach my $FNAME (@F){ open(FILE,"$FNAME")or die "cannot open txt_file: $!";#fname.txtに記載してあるファイルを開く open(OUT,">". "new_file/$FNAME")or die "cannot write txt_file: $!";#new_fileを開いて書き込む while(<FILE>){#以下、ファイルの置換内容 my @d; if (m/^[X1-9]+ (.*)/s) { ($y,$z)=(0,0); $d[0] = ++$x; $d[1] = 0; $d[2] = 0; $_ = $d[0] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+ (.*)/s) { $z=0; $d[0] = $x; $d[1] = ++$y; $d[2] = 0; $_ = $d[0] . "." . $d[1] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+\.[X1-9]+ (.*)/s){ $d[0] = $x; $d[1] = $y; $d[2] = ++$z; $_ = $d[0] . "." . $d[1] . "." . $d[2] . " " . $1; } print OUT $_; } } close(IN); close(FILE); close(OUT); exit ; }

  • find で探したファイルを探した階層の一つ上へ移動したい

    findコマンドで、深い階層にあるファイルを一階層上へ移動するfindコマンド記述方法を探しています。 /home/user1/text/2007/01/06/text/aaa.txt を /home/user1/text/2007/01/06/aaa.txt へ移動するのが目的です。 ファイルの格納状況は、 /home/user1/text/[1983-2007]/[01-12]/[01-31]/text/ という構造のディレクトリに*.txtが格納されています。 suse10.0, bashです。よろしくお願いいたします。

  • シェルでファイルの最下行を削除する方法

    シェルでファイルの最下行を削除する方法 シェルで、ファイルaaa.txtの最下行を削除したいです。これを1行で実現したいです。 exには-cってオプションがあるので、ex -c '$d' aaa.txt などと試してみましたがダメでした。 ;(コロン)や&&でつなぐのは、1行ではないって事でお願いします。 >cp aaa.txt tmp && sed '$d' tmp >aaa && rm tmp #こういうのは無しって意味です。 事前にスクリプトや、それ専用のバイナリを用意しておくのも無しでお願いします。なるべく汎用的な どこのUNIXにでもあるようなコマンドで実現したいです。

  • 行数ごとに検索をかけて並び替えをしたいのですが・・(再投稿です)

    QNo.2658731 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2658731 上記の件、解決したと思ったのですが問題が発生したので再投稿します。申し訳ございません。 こちらデータの吐き出しには成功はしたものの、重複があり困っています。正規表現の問題だとは思うのですが・・。 (空白があるものも別として数えたい) あと、分けるときに区切りをつけたいのですが、うまくいきません。 単純にエディタで区切りを記入するだけではだめなのでしょうか。 (下記のようにしたいのです・・。) /aaa/aaa.txt /sss/aaa.txt ---------------------------------- /bbb/bbb.txt /ccc/bbb.txt ---------------------------------- /yyy/ccc.txt /zzz/ccc.txt ---------------------------------- お手数ですが、お時間に余裕のある方教えていただけますでしょうか。 よろしくお願いいたします。

  • [シェルスクリプト]ファイル変換後に空になる

    ubuntu ver9.04 上で以下のような連番(01~09)の付いたCSVファイルの4,5,11,12列目のフィールドを抜きだし区切り文字を","から空白に置き換え.datファイルにするというシェルプログラムを作っています. たまに一部のファイルが空で出力されます.(ファイルは出力されるのですが中身がない)なぜでしょうか? 誰かご教示願います. #!/bin/bash passB="./data/sw0174-h13-d0-" passA="0001" kaku=".csv" dat=".dat" #echo $passB # input file number echo 'Please input minimum file number (ex.03)!' read fnumin echo 'Please input maximum file number (ex.05)!' read fnumax delta=`expr $fnumax - $fnumin` echo "delta=" echo $delta cnt=0 while [ "$cnt" -le "$delta" ] do echo "cnt=" echo $cnt fpass=$passB$fnumin$passA$kaku echo $fpass cvtf=$passB$fnumin$passA$dat echo $cvtf cut -d ',' -f 4,5,11,12 $fpass > $cvtf cat $cvtf | sed -e 's/,/ /g' > $cvtf cnt=`expr $cnt + 1` fnumin=`expr $fnumin + 1` fnumin=0$fnumin echo "fnumin=" echo $fnumin done

専門家に質問してみよう