• ベストアンサー

awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか

awkでファイルから読み込んだ値を、演算させるにはどうしたら良いですか。 ファイル(hoge.txt)の内容は、次の通り(全4行) 123 456 50 20 これを、bashスクリプトで計算させます。 FF=`cat hoge.txt | awk 'BEGIN {x=$2;printf ("%s, %s", (148+x*0.05), x);}'` echo "答え = ${FF}" このときの$2の値は、50です。但し、文字列として扱われているようです。 xの値を、数値として代入され、四則演算をさせるにはどうしたら良いですか? 以上、よろしくお願いします。

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

  • ベストアンサー
  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.2

こんにちは awk の扱い方に疑問があります。 >ファイル(hoge.txt)の内容は、次の通り(全4行) >123 >456 >50 >20  awk はレコードを改行で認識します。 4行ということですから4レコードなりフィールドは1つだけです。  ということは BEGIN{}により、$1 にデータ 123 だけは入る(BEGINなので1回だけ)が $2 はヌル(処理系によっては不定?)になるはずで「このときの$2の値は、50です。」の文脈が解せません(^^; 3番目のデータだけ計算したいのであれば、下記のように書くんじゃないかと思われます。 awk 'BEGIN{i=0}{i=i+1;if(i=3)print $1*0.05+148,$1;}'  あえて printf を使いませんでした。また、質問者さんの意図を完全に把握していません。見当違いだったらごめんなさい。

xcode_15
質問者

お礼

ありがとうございます。 $2が3行目だと思い込んでいました。 (^^; if(i=3)を、if(i==3)にしたら思い通りの動きになりました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

#1です。$1 等の値については、 echo `cat hoge.txt` | awk '・・・・ と勘違いして回答してました。echo `cat hoge.txt` すると、4行が1行に変わるので、てっきりそうだと思い込んでました。

xcode_15
質問者

お礼

ありがとうございます。 何とか解決できました。

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.1

BEGIN{ } に命令を書いているので、入力を読んでません。従って、$2 も空です。 cat hoge.txt | awk '{。。。。。}' だと、{ }の中で、$1="123", $2="456", $3="50", $4="20" になります。

関連するQ&A

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

  • awkの入力ファイルをリダイレクト先にする方法

    ---------hoge.txt--------- hoge hoge hoge ------------------------- 等としておいて、 $ awk '{print NR":"$1;}' hoge.txt とすると標準出力に ------------------------- 1:hoge 2:hoge 3:hoge ------------------------- と表示されますが、これを $ awk '{print NR":"$1;}' hoge.txt > hoge.txt と自分自身にリダイレクトするとhoge.txtは空になってしまいます。 hoge.txtに上の標準出力を上書きするにはどのように書けば良いのでしょうか、教えてください。 awkだけでなく、テキストファイルを入力にできるコマンド一般についても 上記のようなことができる方法があれば、教えていただきたいです。

  • 今、awkを使ったシェルスクリプトを作っています。

    今、awkを使ったシェルスクリプトを作っています。 aaa bbb ccc ddd ee ff gggg hhh といったファイルから、 bbb,ccc ff,gggg を取り出したいと思っています。 そこで、以下のコマンドをwhileでまわして、$iを増加させることにより、 ファイルを一行ずつ読み取り、目的の列を取り出したく思っています。 A=`cat sample.txt|awk 'NR == $i {print NR, $2;}'` B=`cat sample.txt|awk 'NR == $i {print NR, $3;}'` ところが、awkコマンドの中の$iがシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • shellスクリプトに複数の引数を渡したい

    shellスクリプトに複数の引数を渡したいと考えています。 下記のようなperlスクリプトを兼ねる事でやりたいことは達成できました。 これをシェルスクリプトだけでやろうとしていて、ハマってしまい、やり方がわからなかったので、質問しています。 ・echo.shの中身 $ cat echo.sh echo $1 $2 ・imglist.plの中身 $ cat imglist.pl my@imglist= `ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} 2>1&`; foreach(@imglist){ my@name=split /\./,$_; system("bash ./echo.sh $name[0] $name[1]"); } ・実行すると、無事echo.shに引数が2つ渡る。 $ perl imglist.pl abc1 jpg abc10 png abc11 png abc2 jpg abc3 jpg これをシェルのみでやろうとして、はまってしまいました。 以下は、パイプ処理等を使ったりしてやってみたのですが出来ませんでした。 ・awkでファイル名と拡張子に分解し、パイプで渡そうとしても何故か渡らない・・ $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}'| bash ./echo.sh ・ファイルに一旦保存し、catコマンドでパイプで渡しても駄目 $ ls -1 *{.gif,.bmp,.jpg,.jpeg,.png} | awk -F . '{print $1,$2}' > imglist.txt $ cat imglist.txt | bash ./echo.sh ・echoコマンドを使ってパイプで渡しても駄目 $ echo `cat imglist.txt` |bash ./echo.sh ・for.shというファイルを作成し、for構文でimglist.txtの中身を渡すと引数が一つずつしか渡らない $ cat for.sh for id in $(cat imglist.txt); do echo $id done $ bash for.sh tile1 jpg tile10 jpg どうやれば、コマンドライン上やシェルスクリプトだけで、今回はファイル名と拡張子という形で複数行からなる2つの引数を渡すことができますでしょうか

    • ベストアンサー
    • Perl
  • 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" } }'

  • 中継ファイルを用いないで、テキストファイルを書き換える方法ってあるの?

    RedHat9でbash等を使用してます。 /home/user01/hoge.txtを加工したいのですが $ perl -npe 's/^\s//' /home/user01/hoge.txt > /home/user01/hoge.txt としたら、/home/user01/hoge.txtが空ファイルになってしまいました。 中継ファイルを用いないで行う方法は有りませんでしょうか?

  • awk詳しい方へ

    あるファイルの最終行のみ、他の行と出力形式を変えたいのですが awkとNRを使ってスマートにできないでしょうか? 詳しい方ご教授お願いします。 不細工に作ると(ファイル名xxxのとき) nnn=`wc -l xxx | awk '{print $1}'` awk '{ if (NR != $nnn) printf("%s %s \n",$1,$2) else printf("%s %s \n",$3,$4) }' aaa こんな感じでしょうか。 なんか、一行とかでかけないでしょうか?

  • Unix初心者による初心者シェルプログラミングです。

    Unix初心者による初心者シェルプログラミングです。 以下のようなコマンドを羅列しただけの スクリプトが300行(実質100行ぐらい)が漸くできるようになりました。 これだけで、おばかさんな私は進化してます。が・・・ 対象となる、hoge.txtは、同ディレクトリ内に別名で、200ファイル有ります。 このスクリプトがその別名、200ファイルへと対象になります。 と云う事はファイル名分の200ファイル分スクリプトを編集して用意しなくては いけなくなる。 となると・・・ 別の事をしないといけませんよね。 どうやら、同ディレクトリ内にある、全ての .txt ファイルに対してこの スクリプトを実行させるには・・・ (よくわかりませんが・・・) FILE=`/home/foo/*.txt` みたいな・・・(全然違うと思っていますが、イメージで) /home/foo/ 内の .txt ファイルを一ファイルずつ読み込んで、実行させる方法が あると思うのですが・・・ 全てを教えて貰うつもりはありません。 学習していきます。 でも、疲れてきました。 がしかし、やらなくちゃいけません。 ヒント下さい。 お願いします! > cat hogehoge.sh #!/usr/bin/sh DAY=`/usr/xpg4/bin/date '+%Y/%m/%d%a'` HUMAN=`/usr/ucb/whoami` TIME=`/usr/xpg4/bin/date '+%H:%M:%S'` echo echo "$DAY : $HUMAN : PID $$" echo echo "$0" echo echo "$TIME Let's start!" echo echo "ls -l /home/foo/hoge.txt" ls -l /home/foo/hoge.txt echo echo "cat -n /home/foo/hoge.txt | head -15" cat -n /home/foo/hoge.txt | head -15 echo echo "sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt" sed -f /home/foo/script.sed /home/foo/hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo echo "cat -n /home/foo/new-hoge.txt | head -18" cat -n /home/foo/new-hoge.txt | head -18 echo echo "sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt" sed -e '1d' -e '14d' /home/foo/new-hoge.txt > /home/foo/renewal-hoge.txt echo echo "ls -l /home/foo/renewal-hoge.txt" ls -l /home/foo/renewal-hoge.txt echo echo "diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt" diff /home/foo/new-hoge.txt /home/foo/renewal-hoge.txt echo echo "sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt" sed -e '13d' -e 's/^iranai/hitsuyou/' /home/foo/renewal-hoge.txt > /home/foo/new-hoge.txt echo echo "ls -l /home/foo/new-hoge.txt" ls -l /home/foo/new-hoge.txt echo ・ ・ ・ ・ ・ ・ ・ ・ 300

  • 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 宜しくお願いいたします。

  • awk と gawk の書き方の違い

    PCでAWKコマンドを使いたくてgawkを使ってみたのですが、 やっぱりawkのような書き方では上手く実行できないみたいです。 gawkのバージョンは v3.1.6です。 コマンド (awk) awk -F, '{printf("copy aaa\%s bbb\%sn",$0,$0)}' list.txt 単純にDOSのバッチをファイルから作りたいだけなのですが・・・gawkではどのように書けば良いのか教えてください。お願いします。 仕事でUNIXを使っていたのですがPCに移行するという話がでていて、今までのunixコマンドをPCで動くようにソースを書き直して行かなくてはならないのにパスを『/』から『\』にしただけでは全く動きませんでした。やっぱりUNIXのawkでは出来てPCのgawkでは出来ないこともあるのでしょうか?それとも書き方の問題でしょうか??

専門家に質問してみよう