ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:AWKスクリプトのエラーびついて) AWKスクリプトのエラーについて質問 2005/12/21 15:02 このQ&Aのポイント AWKスクリプトのエラーについて質問があります。以下のようなAWKスクリプトでエラーがでます。エラーメッセージが表示され、どうしてこの行でエラーが発生するのか理解できません。ご教示いただけないでしょうか? AWKスクリプトのエラーびついて AWKアスクリプトのエラーについて質問があります。 以下のようなAWKスクリプトでエラーがでます。 #!/bin/nawk -f BEGIN{ npl = 30; ppl = 200; pd = 110; nd = 46; m1 =0.074; } { 処理 } エラーメッセージ /bin/nawk: syntax error 7 行目 コンテキスト m1 >>> =0.074; <<< なんで,こんなところでエラーが出力されるのかよくわかりません。 どなたか教えていただけないでしょうか? 質問の原文を閉じる 質問の原文を表示する みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー mac_res ベストアンサー率36% (568/1571) 2005/12/21 16:20 回答No.2 m1 =0.074; この行の後ろに全角スペース2個が入っているのは、C&Pミスですか? 質問者 お礼 2005/12/21 16:30 ご推察の通り,入力ミスでした。 ありがとうございました。 おはずかしい。 通報する ありがとう 0 広告を見て他の回答を表示する(1) その他の回答 (1) chie65536 ベストアンサー率41% (2512/6032) 2005/12/21 15:34 回答No.1 ×m1 =0.074; ○M1 = 0.074; 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発その他(プログラミング・開発) 関連するQ&A AWKスクリプトについて AWKスクリプトで あるファイルの中の3単語目の最大文字数を表示させたくて以下のようなスクリプトを作成しました。 #!/bin/nawk -f BEGIN{ maxword = 0; } { if( length( $3 ) > $maxword ) maxword = length( $3 ); } END{ print $maxword; } 単純なスクリプトなのですが, テストしてみると空白の出力しかされません。 なにか間違っているのでしょうか? どなたかアドバイスをお願いします。 awkのファイル出力について 今までシェルスクリプトではレスポンスが悪い為awkを使い始めました やりたい物は一応作れたのですが、ファイル出力が美しく無いので ご教授ください。 shで A="/export/home/report" echo hogehoge > $[A]/test.txt という感じで、awkの中でファイル出力させるときに パスやファイル名を変数に入れてそこに出力する方法はないでしょうか? こんな感じでやるとエラーになります。 nawk '{ BEGIN{ A="/export/home/report" } END{ echo hogehoge > $[A]"/test.txt" } }' シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか? awkのBEGINについて awkのBIGIN内で、データファイルの途中のレコード情報を取得することは可能でしょうか? 以下が行いたい詳細です。 下記例のテキストファイルの”DATE”行をawkスクリプトファイルのBEGIN内で取得したい。 例:test.txt 11111 22222 33333 DATE=20040706 44444 よろしくお願いいたします。 AWKスクリプへの引数の受け渡し AWKスクリプトへの引数の受け渡し法がよくわかりません。 具体的には以下のようなスクリプトです。 #!/bin/nawk -f { if( $1 == "2" ) printf( "2 CHK;\n" ); else print $0; } このスクリプトの”CHK”という文字列をスクリプト起動時 にこのスクリプトに引渡してスクリプトの動作を動的に変更したいのですが、方法がよくわかりません。 また、このスクリプトの起動はシェルスクリプトから起動 させることを考えています。 ご存知の方アドバイスをお願いします。 AWKスクリプトの入力ファイルについて AWKスクリプトで入力ファイルを複数使用することは 可能でしょうか? 実際にやりたいことは 例えば ファイル1 NQN PQP RPO ファイル2 MN NQN MP PQP R RPO というような2種類のファイルがありファイル1が実際に処理をする入力ファイル でファイル2が対応表に該当するファイルです。 ファイル1とファイル2を読み込んで ファイル1を NQN MN PQP MP RPO R というように加工して出力したいのですが AWKでこういった処理は可能なのでしょうか? awkでのsh処理について HP-UX環境、UNIXです。 1行目の11カラム目にOUTが含まれているかつ2行目の11カラム目にINが含まれている行だけ ファイルに出力するという処理を以下のように考えたんですが、うまくいきません。 awk'{m == NR % 2} m==1{if($11~ "OUT")} && m==0{if($11~ "IN") print $0} ' [ファイル名] 文法的に誤っていますでしょうか?? 回答宜しくお願い致します。 Solarisのawkでの正規表現の使い方について ご存知でしたら、教えてください。 Solarisのawkで、変数に対しての比較に正規表現が使えないのですが、 よい方法をご存知の方がいましたら、教えて下さい。 nawkなら、上手くいくのですが、awkでは無理なのでしょうか? また、Linuxのawkなら、上手くいきました。 よろしくお願いします。 例)下記の場合、./test.shを実行すると、test.awkの正規表現を使用している部分[if ( $7 ~ HENSU )] でエラーになってしまいます。 --------------------test.shの中身-------------------- #!/bin/sh HENSU="3A" cat testdt.txt | \ awk -f test.awk HENSU=${HENSU} exit 0 ----------------------------------------------------- --------------------testdt.txtの中身-------------------- aaaaa bbbb ccc ddd eeeee ffffff gg3Aggggg hhhhhhh iiiii aaaaa bbbb ccc ddd eeeee ffffff gggggggg hhhhhhh iiiii aaaaa bbbb ccc ddd eeeee ffffff gggggggg hhhhhhh iiiii ----------------------------------------------------- --------------------test.awkの中身-------------------- BEGIN{ FS="\t" } { if ( $7 ~ HENSU ) { print $0 } } ----------------------------------------------------- 簡単なシェルスクリプトを見てください。 次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか? awkについての質問 実行環境:AIX5.2 シェル:Ksh 以下の2点をシェル内部で実行しているのですが、上手くいきません。 ご教授お願いいたします。 (1)System関数の実行結果(標準出力)をTERM上に表示させず、処理をしたい。 #!/usr/bin/ksh awk '{ system("ls -l") ###具体的にはls -l 結果の2行目、第一フィールドをawk内で変数に格納 }' (2)変数に格納された文字列のバイト数を取得し、変数に格納したい。 length()は文字数を取得できる事は理解したのですが、文字数ではなく、文字列のバイト数を取得したいです。awkに実装されている関数などありますでしょうか? awkによる日付編集 vmstatをファイルへ出力する時に、1行毎に日時を編集したいのですがうまく出来ません。AIXですと下記のスクリプトでうまくいっているのですがsoralisではどのようにしたらよいでしょうか。 vmstat $1 $2 | awk '!/kthr|---|avm/ {printf("%s | ", $0);system("date")}' >> $LOGDIR$DATE 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行目の文字列を取り出すにはどのようにすれば良いでしょうか。 AWKスクリプト作成法 その3 AWKスクリプトで以下のようなことをやりたいのですが どのようなすればできるでしょうか? いい方法を教えてもらえないでしょうか? 入力ファイル例 LAYER部 LAYER AAPOL 10 LAYER ABPOL 11 LAYER ACON 15 LAYER AM1 17 : 処理部 APOL = AAPOL NOT WIN M1 = AM1 NOT WIN CON = ACON NOT WIN : POL = APOL AND FLD : 修理するファイルの形式 [1] LAYER部 ”LAYER AAPOL 10”といった形式で”AAPOL”が”10”に割り当てられる [2] 処理部 ”APOL = AAPOL NOT WIN”といった形式で各単語が論理演算される。 [2]の処理部では「1]で定義された単語が何度論理演算されているかはわからない。 AWKでおこないたい処理 (1)LAYER部で”10”、”17”で定義された単語(例では”AAPOL”と”AM1”)を取得 (2)処理部で(1)で取得した単語を使用して処理部で作成された全単語を取得 awkスクリプトでダブルクォーテーションの削除 作成しているawkスクリプトを実行すると ”aaa" "1111" "kkk" ”bbb" "2222" "jjj" という出力になってしまいます。 ダルルクォーテーションを削除したかったので printf(”%s %s %s\n"、 adata、 bdata、 cdata) ↓ adataprint =gsub(”¥””、” ”、adata) bdataprint =gsub(”¥””、” ”、bdata) cdataprint =gsub(”¥””、” ”、cdata) printf(”%s %s %s\n"、 adataprint、 bdataprint、 cdataprint) としてみたのですが思ったような出力 aaa 1111 kkk bbb 2222 jjj にはなってくれません。 こういった処理はどのようにすればいいのか誰か教えていただけないでしょうか? シェルスクリプトの中のawkユーザー定義関数 cシェルの中でawkのユーザー定義関数を使う方法について教えてください。 以下の内容の入力ファイルがあったとして、 3 3 306 2 2 258 1 1 105 3列目を数値の大小に応じて、別の数値に置き換えて以下のファイル 3 3 10 2 2 9 1 1 8 を出力したいのです。 cシェルスクリプト中でawkのユーザー定義関数を使って作成したいのですが、シェルスクリプト中に関数をどこでどう定義してよいか分かりません。 cシェルスクリプトの中身は #/bin/csh -f gawk'{print $1,$2,symbolsize($3)}' input_data > output_data で、以下の関数を定義したいのです。 function symbolsize(ccc){ if (ccc >= 300) return 10 #300以上なら10を返す if (ccc >= 200 && ccc < 300) return 9 #200以上300未満なら9を返す else return 8 #それ以外なら8を返す } プログラミング初心者なので、なにとぞよろしくお願いします。 awkで項目番号ごとに行を列に並べる [入力ファイル] a 10 1 b 10 2 c 10 3 d 10 4 a 20 5 b 20 6 c 20 7 d 20 8 a 30 9 b 30 0 c 30 1 d 30 2 を、2列目の項目番号を行、1列目の記号を列として (エクセルのピボットテーブルのようなイメージです) 以下のように並べ替えたいのです。 [出力ファイル] No. a b c d 10 1 2 3 4 20 5 6 7 8 30 9 0 1 2 これをawkスクリプトで書きたいのですが、 どのように書けばよいでしょうか? ※下記2点は希望ですが、難しければ非対応でも大丈夫です。 ・入力ファイルの1行目は一応abcdの順番にきれいに並んでいるものですが 順番がabdcなどとずれていても処理できるスクリプトにしたいです。 ・出力後のabcdの列順序は、スクリプトを修正することで 自由に変更できるとさらに助かります。 教えてください。 よろしくお願いいたします。 【継続質問】シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入 シェルスクリプトを用いて、ある特定の文字列の前に文字列を挿入 の継続質問です。よろしくお願いします。 tacとawkを用いて、"ある特定の文字列の前に文字列を挿入"ということができるのは、 確認することができました。 例えば、 script.awk (awkスクリプト) sample.txt (処理対象ファイル) という環境で、 $ cat script.awk $ tac sample.txt | awk -f script.awk | tac > sample2.txt とコマンドを入力した場合、 sample2.txtに、処理が完了したテキストが作成され、 中身も問題ないことを確認できました。 しかし以下のようなことを実現しようと思うと、 うまく行きませんでした・ 「非対話的に上記の処理を行いたいのです」 上記の方法では、 catとtacと2回コマンドを叩く必要があります (1回にもできるのでしょうが…) できれば、自動的に流れる膨大なシェルスクリプトの処理の中で、 上記の処理を自動的に行うということを実現したいのです。 例えば、auto.shというシェルを実行すれば、 勝手にawkスクリプトを読み込み、勝手に変換したものを出力してくれる… そのようなシェルを作成したいと考えています。 そこで色々試しましたが上手くいきません。 1.コマンドの分解ができない tac sample.txt | awk -f script.awk | tac > sample2.txt の上記を、 #!/bin/sh tac sample.txt awk -f script.awk tac > sample2.txt のようにシェルスクリプトに記述しなおして実行しましたが、 上手くいきませんでした。 2.script.awk(awkスクリプト)を内部に取り込み 外部ファイルとして存在している、script.awkをなんとか シェルに組み込もうと思って、 awk {(script.awkの内容をそのまま記述)} のように行いましたが、文法的にやはり無茶苦茶でした・・・。 正直、2番が無理であれば仕方ありませんが、 最低でも1は実現したいと思います。 1の方法だけでも良いので、どなたか回答をお願いします。 awkでの出力項目の追加方法について はじめまして。 急遽UNIXサーバをメンテすることになったUNIX素人です。時間に迫られており勉強する時間も今はとれず、皆様のお知恵をお借りしたく質問させていただきます。 現在、コマンド出力結果などの各行の先頭に、日時分秒を追加してテキストファイル出力するシェルスクリプトの作成をしています。 awk を使用して実現したいと思っていますが、具体的な方法についてアドバイスをいただけたらと思っています。 なお、コマンド出力結果をawkへ引き渡す方法は、スクリプト内で直接渡しても、一旦ファイル出力したものを読み込む形のどちらでもよいと思っています。 例 ・ps の出力結果 PID PPID PGID WINPID TTY UID STIME COMMAND 1072 1 1072 1072 con 1005 10:41:29 /usr/bin/bash 1052 1072 1052 544 con 1005 10:50:14 /usr/bin/ps ・日時分秒 を追加した結果 DATE PID PPID PGID WINPID TTY UID STIME COMMAND 200705111735 1072 1 1072 1072 con 1005 10:41:29 /usr/bin/bash 200705111735 1052 1072 1052 544 con 1005 10:50:14 /usr/bin/ps 大変初歩的な質問で申しわけありませんが、なにどぞご教授お願いします。 awkによるあるプログラムその2 立て続けに申し訳ないですが、 次のプログラムを実行すると、 gawk: ./test.awk:19: fatal: function name `foo' previously defined というエラーになってしまいます。 なぜでしょうか? #!/usr/bin/gawk -f #test.awk: BEGIN{ a="OK"; b="OK"; c="OK"; print foo(1,2); print a,b,c; print bar("AWK is", "convenient"); print a,b,c; print "4!==" recursive(4); } function foo(a,b, c){ c=a+b; return c; } function foo(a,b, c){ c=a b; return c; } function recursive(a){ if(a<=1)return 1; else return a*recursive(a-1); } シェルスクリプトでmd5sum シェルスクリプトでmd5sumを計算して2つのファイルを比較しようとしています。 /bin/sh # ファイル名を出力 echo "fileout1_${file1DirFile}"→/var/log/httpd.log 入っています。 echo "fileout2_${file2DirFile}"→/root/httpd.log 入っています。 #-- MD5値取得 file1DirFileMD5=`md5sum ${file1DirFile} | awk '{printf("%s",$1)}'` file2DirFileMD5=`md5sum ${file2DirFile} | awk '{printf("%s",$1)}'` この後、ifで「file1DirFileMD5」と「file2DirFileMD5」比較。 <質問> #-- MD5値取得 の部分の下二行で、シェルスクリプトが止まります。 止まる原因が分からないのです。(処理が進まず、止まったままになります) 原因がわからず困っております。 別の書き方でも構わないので、解決方法はないでしょうか。 ご教授お願いします。
お礼
ご推察の通り,入力ミスでした。 ありがとうございました。 おはずかしい。