• ベストアンサー

ファイルの中身の操作について

今あるファイルの中身の読み込みに、 set EDPTODAY = `awk -F , '/$EDPCLND/ {print $5,$9}'` echo $EDPTODAY と書くと、構文エラーが出てしまいます。 ","区切りなので、"awk -F , "と表記したのですが・・・ ($EDPCLNDで宣言しているファイルの存在は確認しました。) お解りの方、どうお宜しくお願いいたします。

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

  • ベストアンサー
回答No.2

すみませんが、何をしたいのでしょう? EDPCLNDというシェル変数にはファイル名が入っているのですか? そのファイルは何行あるかわかりませんが、その第5, 第9フィールドを 全部とりだして、EDPTODAY にセットしたいのですか? awk で /.../ というのは、そこに書かれたパターンにマッチした行について、 対応する { ... } の内容を実行しろということですので、 awk は標準入力に対して、$EDPCLND というパターンを探します。 でも、$ は行末にマッチする表現なので、 行末以降にある EDPCLND という文字列があるとは考えられないので、 たぶん、どの行にもマッチしないでしょう。 $EDPCLND が含むファイル名のファイルの中身を awk に読ませたいなら、 awk '/.../ {...}' $EDPCLND となるのが普通です。 それ以外のことをしたいのなら、補足してください。

ami_mizuno
質問者

補足

補足します。 有るファイル(EDPTODAYとは別ファイル)を一行単位で読み込み (此処の部分は別なので書いていません)、 読み込み内容をEDPTODAYに格納、そしてその切り出した内容の その第5, 第9フィールドをとりだして中身を確認と言う処理を行いたくて、 こういう風に書いたのですが・・・ そうすると、上記のような処理を行いたい場合には set EDPCLND = `more PDXFGKS.TXT`(PDXFGKS.TXTの中がまだ一行しかないのでこうしています) set EDPTODAY = more $EDPCLND`awk -F , '{print $5,$9}'` で宜しいのでしょうか?

その他の回答 (4)

  • mph
  • ベストアンサー率54% (39/72)
回答No.5

あるファイルを一行単位で読み込んで処理するとのことなので testというスクリプトとします。usage: ./test ugo(処理するファイル名) awkのみで書くことも可能ですが、前後にshellの処理が入るとして、一応 参考までに書いてみました。雛型に利用できるかもしれません。 デバックしてないのでその点はご容赦ください。 これならいっそのこと全部awkの方が楽かも。 #!/bin/sh cat $1 |awk '{FS=",";} /.*/ { print $5,$9; do printf("realy do job on this data?(y/n):"); getline reply <"-"; while(reply~/[yYnN]/); if reply~/[yY]/ { 何かの処理; } }'

回答No.4

ファイルの中身、シェル変数に格納されている文字列、標準入出力で流れる データの区別が完全にはついていないとみうけられます。 $EDPCLND という変数には、ファイル名じゃなくて、PDXFGKS.TXT というファ イルの中身のある1行が入っているのですね?で、その行の、第5,第9フィール ドを、別の変数に格納するということでよろしいでしょうか? それなら、 set EDPTODAY = `echo $EDPCLND | awk -F, '{print $5,$9}'` でどうでしょう?

  • mph
  • ベストアンサー率54% (39/72)
回答No.3

set EDPTODAY=`cat $EDPCLND|awk '{FS=",";} /.*/{print $5,$9;}'` echo $EDPTODAY はどうでしょうか?

  • ita3
  • ベストアンサー率67% (25/37)
回答No.1

awk で、-F を使うときは、スペース無しで セパレータを記述します。 awk -F , '/$EDPCLND/ {print $5,$9}' ではなくて、 awk -F, '/$EDPCLND/ {print $5,$9}' とやってみてはいかがでしょうか。

関連するQ&A

  • ディレクトリ内の全てのファイルの中身を操作したい

    ディレクトリ内に、例えば10個のテキストファイル a.txt b.txt c.txt d.txt e.txt f.txt g.txt h.txt i.txt j.txt があり、その中身にそれぞれ 2 6 98 65 4 52 98 100 82 56 という数字が書かれているとします。 これらのファイルの中身の平均をawkを用いたコマンドで表示させたいのですが、自分なりに頑張ったのですが実行できませんでした。 (cat * | awk'{BEGIN{total += $0; i += 1}END{print total/i}' のような感じで) どうすれば実行できるのか、よろしければお教えください。

  • Kシェルにて区切り文字の抽出について質問です。

    空白区切りの最後の文字を抜き出したいのですが うまくいきません。 どのような構文にすればよいのでしょうか? cat file.txt | awk -F "" '{print (分からない。。)} 行末は $ だと思い、使用してもダメなのです。。。

  • csvファイルから、データをシェルで取り込みたい

    前の質問 http://oshiete1.goo.ne.jp/kotaeru_vote.php3?q=4899864 他の質問コーナー http://okyuu.com/ja/question/6095 MySQLのデータベースを作成するために、csvファイルをつくって、シェルでテーブルに取り込みたいと思っています。前のスクリプトを書き直したので、新規質問という形で書かせて下さい。 【環境】LINUX Fedora10 MySQL5.0 インターネット接続できず、USBメモリでデータを運んでいる。ここのスクリプトもコピペではなく手書き。 #bash torikomi.sh とうつと torikomi.sh: line 19 : syntax error : unexpected end of file とでてきてしまい、うまく処理できません。 ひとまず、Perlなどは使わず、bashのみにて処理を行いたいと思っています。(Perlは知らない言語なので) スクリプト #!/bin/bash set hensu=`cat /home/******/data1.csv` for i in $hensu do set a=`echo $i | awk -F, '{print $1}'` set b=`echo $i | awk -F, '{print $2}'` set c=`echo $i | awk -F, '{print $3}'` mysql --user=root --password=****** db1<<EOF insert into tbl2(aaa,bbb,ccc) values($a,"$b","$c"); EOF done

    • ベストアンサー
    • MySQL
  • csvファイルからMySQLにシェルで取り込みをしたい

    【環境】LINUX Ferora10 mysql 5.0 インターネット接続できないPC(データはUSBメモリで導入可能) bash/mysql初心者 教えてgooの参考ページ ​​http://oshiete1.goo.ne.jp/kotaeru.php3?q=2219411​​ mysql で db1 というデータベースに、tbl2というテーブルを作成しました。ここにcsvファイルから、データをインサートしたいのですが、うまくいきません。 これはうってみたコマンド #bash torikomi.sh エラーは syntax error near unexpected token '(' insert ~文 とかがでます。 下記にソースを貼るので間違いがあったら、教えていただけないでしょうか? #!/bin/bash set hensu='cat /home/******/data1'; for i in $hensu do set a='echo $i | awk -F, '{print $1}'' set b='echo $i | awk -F, '{print $2}'' set c='echo $i | awk -F, '{print $3}'' mysql --user=root --password=*******    use db1; insert into tbl2(aaa,bbb,ccc)values(a,"b","c"); exit done できれば、バックグラウンドでMySQLを起動して、いちいちログイン/ログアウトを繰り返さず、 インサート文を打てればいいのですが。

    • ベストアンサー
    • MySQL
  • kshでの文字列操作

    以下の文字列のうち、node1,node2部分を取り出したいです。 -------------------------------------------------------- rg non-concurrent PRIMARY="node1:node2" -------------------------------------------------------- このnode1,node2の部分は0~20バイト程度で変動します。 1バイト以上あればawkなどを組み合わせることで取り出すことができると思いますが、0バイトの場合があるため扱いに困っています。 いまこちらで考えているもの(1バイト以上の場合)は以下のような記法です。 STRING='rg non-concurrent PRIMARY="node1:node2"' NODE1STR=`echo $STRING | awk -F\" '{print $2}' | awk -F: '{print $1}'` NODE2STR=`echo $STRING | awk -F\" '{print $2}' | awk -F: '{print $2}'` awkを二重にしている箇所は-Fの引数を正規表現すれば短縮できるかもしれません。 このnode1部分がゼロバイト(PRIMARY=":node2"のような状態)になっても対応できるような、シンプルな書き方はないでしょうか? よろしくお願いします。

  • awkでのファイル読み込み

    シェルを作成しています。 昔kshを作ってたので、ksh+awkでCSVファイル処理をしたいのですが、記憶が古く、覚えていないし、調べてもわかりませんでした。 参考になるサンプルソースや、参考になるHP等助言頂けたうれしいです。 ファイル読み込みがうまくいってないのか、getlineを使うべきなのか..。 #!/bin/ksh -x #Parameter Check if [ $# -ne 1 ];then echo "Error File Name Must Specified" exit 1 fi # Check File Exist ls $1 >/dev/null 2>&1 if [ $? -ne 0 ];then echo "Error File Not Found" exit 1 fi # Read File awk -F"," '{  フィールドセパレター変更→CSVファイルを一行ずつ読み込み→各処理をしたいです。 }' $1 宜しくお願いいたします。

  • ファイルの差分検出シェル教えてください(bsh)

    ファイル1(f1)とファイル2(f2)で値が一致しないときのみ その行番号を得る方法を教えてください。 2つのファイルの行数は同じです。 例) f1の中身 100 101 902 103 104 f2の中身 100 101 102 103 104 以上の2つのファイルより3行目が不一致のため "3"を得たいです。 ちなみに私が安易に考えたものを記します。 sdiff f1 f2 | grep -n "|" | awk '{print $1}' これでは、"|"のときしか成功しません。(当たり前ですが) 環境はHP-UXでbshです。 awkは基本的なことしか知りません。 詳しいかたよろしくお願いいたします。

  • 処理結果をファイルへ・・・

    set MUCHDAY = `grep $TODAY PDXFGKS.TXT` の結果を、ファイルに書き出したいのですがうまくいきません。 (MUCHDAYは内部変数です) 方法をご存じの方お教え下さい。 (尚、ディレクトリは関数の最初で移動していて、 移動した先にそのファイルを作りたいのです。 その後この様な処理をかませたいので・・・) set EDPTODAY = `more PDXFGKS.TXT | awk -F, '{print $1}'` if($HOLIDAY == "H")then echo "休日シェル作動" else echo "平日シェル作動" endif (PDXFGKS.TXTが結果内容を入れたいファイルです)

  • 以下の様なファイルの中身から重複を取り除いて表示したいのですが、

    以下の様なファイルの中身から重複を取り除いて表示したいのですが、 awk 'NR==1||prev!=$0;{prev=$0}' file.txt の使い方を教えてください。 何故、重複を除いて表示できるのですが。 printなどを使っていないのに表示ができているのですか。 file.txt 以下中身 ---------------------- AAAA BBBB BBBB CCCC CCCC ----------------------- ↓ AAAA BBBB CCCC の3文字のみを出力したい。

  • VBSでファイル作成後、書き込みできない

    ファイルが存在している場合は、ファイルをオープンして書き込み、ファイルが存在していない場合は、ファイルを作成後、オープンして書き込みを行わせたいと考えています。 しかし、ファイルが存在していないとき、ファイルは作成されるのですが、『エラー:800A0046 書き込みできません。VBScript実行時エラー』が出て、書き込みができません。モードをWritingにしても同じでした。 お手数をおかけしますが、ご教示いただけますようお願いいたします。 Option Explicit '■ オブジェクトの宣言 Dim objFSO Dim objFile '■ 定数の宣言 Const strFileName = "C:\VBS\TEST.TXT" '■ 定数の宣言 '// ファイル入出力モード(8:追加書き込み) Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else WScript.Echo "ファイルが見つかりませんでした" Set objFile = objFSO.CreateTextFile(strFileName) If IsObject(objFile) Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If '// ファイルのオープン Set objFile = objFSO.OpenTextFile(strFileName,ForAppending) objFile.WriteLine "2012/12/21,100,ブレーキパッド,35000"