ディレクトリ内のファイルの中身を操作する方法

このQ&Aのポイント
  • ディレクトリ内の全てのファイルの中身を操作する方法について説明します。
  • ディレクトリ内に複数のテキストファイルがあり、それらのファイルの中身の平均値を求める方法について説明します。
  • awkコマンドを使用して、ディレクトリ内のファイルの中身の平均値を計算する方法を解説します。
回答を見る
  • ベストアンサー

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

ディレクトリ内に、例えば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}' のような感じで) どうすれば実行できるのか、よろしければお教えください。

  • rurur
  • お礼率50% (24/48)

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

  • ベストアンサー
  • f272
  • ベストアンサー率46% (7996/17095)
回答No.2

#1です。 幾つか想定外のことがあったようです。a.txtに幾つかの数字が書かれていて最終行も改行がある状況を考えていました。でも,例えば a.txt の内容が 2[EOF] のようになっているのですね。それなら awk '{total+=$1; i+=1;}END{print total/i}' * で十分でしょう。 > コマンドが見つかりません というのは awkと'の間に空白がないせいかな?

rurur
質問者

お礼

そうです、混乱させる書き方で申し訳ありません。 先ほど実行したところ、無事実行できました。 ご教授くださり、誠にありがとうございました。

その他の回答 (1)

  • f272
  • ベストアンサー率46% (7996/17095)
回答No.1

BEGIN{total += $0; i += 1} これを {for(j=1;j<=NF;j++) total+=$j; i+=NF;} こんな感じにしてみたらどうかな。

rurur
質問者

補足

教えていただいてありがとうございました。 (cat * | awk'BEGIN{for(j=1;j<=NF;j++) total+=$j; i+=NF;}END{print total/i}') を実行したところ、「コマンドが見つかりません.」と表示されてしまいました。 (cat * )と打つと私の環境では(269865452981008256)と中身の数字が間隔を置かずに表示されてしまうので、それが原因なのでしょうか。

関連するQ&A

  • フォルダ(ディレクトリ)の一覧をプリントできますか

    フォルダ(ディレクトリ)の一覧を プリントしたいと思っています。 コマンドプロンプトで dir /s /b > aaa.txt を実行すると フォルダ(ディレクトリ)とその中のファイル名が aaa.txtに入ってしまいました。 フォルダ(ディレクトリ)のみ ファイルにいれるか プリントする方法があったら 教えてください。 よろしくお願いします。

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

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

  • 今、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がシングルクォーテーションでくくられているので、 変数展開されなくて困っています。 何かよい方法があればご教授いただけますでしょうか?

  • tcshでの改行の処理について教えてください。

    tcshでの改行の処理について教えてください。 tcshでawkを使っているのですが、 %awk 'BEGIN{n=0}\ {n++}\ END{print n}' というようにしか入力できません。 shでは、普通に awk 'BEGIN{n=0} {n++} END {print n}' でできますよね。 コマンドに渡すコマンド列の扱いが異なったのはどのような理由なのでしょうか? これを回避するよい方法があれば教えてください。

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

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

  • リダイレクト >> を複数のファイルに同時に行いたい

    cat A.txt >> B.txt とコマンドを実行することで、B.txtの末尾にA.txtが挿入されると思います。 これを利用して、複数のファイル(拡張子がtxt)全てにA.txtの内容を挿入させたいのですが、その場合はどういったコマンドを打てばいいのでしょうか? 何か、ディレクトリの中のファイル全てに対して再帰的に処理を施す、という方法がありましたら、お教えください。

  • cat でファイルの拡張子を指定

    基本的なことで申し訳ないんですが、 UNIXのcat コマンドでファイルの中身を出力するときに、カレントディレクトリでないファイルを出力するには、パスも書きますよね。 cat パス/ファイル名 catでパスを指定して使うときに、 パスを繰り返し書かないで、 (その指定したディレクトリ直下だけでいいので)複数の特定の拡張子のファイルのみ出力するには、どうすればよいのですか? 例えば、 拡張子が、cとcsとtxtのファイルだけ出力して、その他のファイルは出力しない というようなときです。 既に書いたとおり、パスは繰り返して書かないので、 cat パス/*.c パス/*.cs パス/*.txt のようなものはナシということでお願いします。

  • -のついたファイル名を操作するには…

    Sun OS 5.8を使用しています。不要なファイルを掃除しようとディレクトリー内を調べていると“-a"というファイル名のついたものが見つかりました。 内容を確かめようとcatやviコマンドで、ファイル名を-aとすると、シェルが-aを コマンドオプションと解釈していまい、うまく扱えません。このファイルの内容を見るにはどうしたらよろしいでしょうか?初歩的な質問で申し訳ありませんが、宜しくお願いします。ちなみにこのファイルはディレクトリーではありません。 一般のファイルで、私には読み書き実行の権限はあります。シェルはUnix標準のKshです。

  • あるファイルと同じファイル名のファイルをbashで生成

    OSはLinuxです。 あるディレクトリAにhoge_i(i=1~100)というファイルがあったとします。 別のディレクトリBに、同名のファイル100個を作りたいのですが、 どのようにすればよいでしょうか。 なお、新ファイルの中身は空でもかまいせん。 タイトルではbashと書きましたが、awkでもかまいません。

  • 一括でファイル名の一部を置換したい

    LinuxのFedora Core 10, シェルにtcshを使用しています。よろしくお願いします。 ======================================================================= 複数のディレクトリ内に、"(from home)"のような文字列を含むファイルがあり、 それらのファイル名から一括で"(from home)"という文字列を取り除きたいのですが ======================================================================= 例えば以下のように、2つのディレクトリ(Directory1,Directory2)の下に、 "(from home)"という文字列を含むファイルが2つずつある場合を考えて、 /Directory1/sample (from home).txt         sample2 (from home).txt /Directory2/ sample3 (from home).txt          sample4 (from home).txt > rename "(from home)" "" `find / -name "(from home)" -print` を試したのですが上手くいかず、 > foreach i (`find / -name "(from home)" print`) foreach? rename "(from home)" "" $i foreach? end でも上手くいきませんでした。 もしかしたらfindコマンドで見つけたファイル名をrenameコマンドに 上手く渡せていないのかと思うのですが、どのようにすれば良いのでしょうか? また別の方法でも、一括でファイル名の一部を変更する方法があれば、 ご教授お願い致します。

専門家に質問してみよう