• 締切済み

[Kシェル] ファイル読み込み

最近Kシェルを始めたばかりでつまづいています。 あるログファイルの行を取得して、 その行のn番目の値を合算したいです。 例:ログファイルの中身 1,1000,AAAA,10000, 2,1000,EEEE,1000, 3,1005,CCCC,1050, ※上記で4番目を合算する場合、  12050と出力したいです。 以前Cシェルを使用していたので、 foreachのような動きを考えていたのですが、 参考書を見ると効率的でない(readを使う) という記載がされています。 ログが数万行に達する可能性があるので、 効率的なやりかたを模索していますが、 何かよい方法がありますでしょうか。 よろしくお願いいたします。

みんなの回答

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんばんは。恐らく IFS(Internal Field Separator)との 合わせ技でしょう。awk の -F, と同じくフィールドの区切りを コンマにするという意味です。 IFS=',' result=0 while read a b c d e; do ((result = result + d)) # let "result = result + d" done < logfile IFS=' ' # 最後は元に戻す echo $result # 12050 IFS の働きで logfile の中の各フィールドが a, b, c, d, e(最後は空)の各変数に収められます。 awk に比べて本当に速いのかどうかわかりませんが。

参考URL:
http://news.software.ibm.com/doc_link/Ja_JP/a_doc_lib/cmds/aixcmds4/read.htm#HDRA143C17A0
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

awkを使うのはダメですか awk -F, '{sum+=$4;} END{print sum;}' log.txt

関連するQ&A

  • あるファイル内容をまとめるシェルについて

    お世話になっております。 あるファイル内容を1つのファイルにまとめて出力する方法はあるのでしょうか? 例: ファイル名:TEST1 aaaa ファイル名:TEST2 bbbb ファイル名:TEST3 cccc 上記ファイルをtest001に出力する。 ファイル名:tast001 aaaa bbbb cccc とこのようなシェルは可能でしょうか? ご教授願います。

  • 外部ファイルを1行ずつ読み込んで特定カラムを引数として

    外部ファイルを1行ずつ読み込んで特定カラムを引数として 外部ファイルを1行ずつ読み込んで特定カラムを引数として 別び外部ファイルに対してgrepをかけたいと考えてます。 DBを作るほどのデータではないので、ファイルの行数を取得してawk/sedコマンド もしくはperlを駆使して実装できればと考えてます。スマートな方法があれば教授ねがいます。 やりたいこと)sample1.logから1/2カラム目を取得して、 sample2.logに対してsample1.logの2カラム目で紐付けて repot.logを出力したい #sample1.log 0001 AAAA 0002 BBBB 0003 AAAA 0004 CCCC  ・  ・ #sample2.log AAAA ABC BBBB DEF CCCC GHI  ・  ・  ・ #report.log 0001 AAAA ABC 0002 BBBB DEF 0003 AAAA ABC 0004 CCCC GHI  ・  ・  ・ 以上

    • ベストアンサー
    • Perl
  • 外部ファイルを1行ずつ読み込んで特定カラムを引数として

    外部ファイルを1行ずつ読み込んで特定カラムを引数として 別び外部ファイルに対してgrepをかけたいと考えてます。 DBを作るほどのデータではないので、ファイルの行数を取得してawk/sedコマンド もしくはperlを駆使して実装できればと考えてます。スマートな方法があれば教授ねがいます。 やりたいこと)sample1.logから1/2カラム目を取得して、 sample2.logに対してsample1.logの2カラム目で紐付けて repot.logを出力したい #sample1.log 0001 AAAA 0002 BBBB 0003 AAAA 0004 CCCC  ・  ・ #sample2.log AAAA ABC BBBB DEF CCCC GHI  ・  ・  ・ #report.log 0001 AAAA ABC 0002 BBBB DEF 0003 AAAA ABC 0004 CCCC GHI  ・  ・  ・ 以上

  • アクセスログから同時ログイン数を割り出す手法

    以下のようにアクセスログが出力されるものがあります。 このログより、ユーザがログインした時点で他に何ユーザログイン しているかを集計する方法を模索しています。 何か良い方法ありますでしょうか。 *************************** user,login,logout aaaa,095703775,100825968 bbbb,095709415,095809695 cccc,095732774,095733633 bbbb,095734883,095735227 aaaa,095735321,095735727 dddd,095742555,095743680 eeee,095742664,095743102 gggg,095743196,095743664 tttt,095801070,095804070 *************************** ・userはログインしたユーザ名、login、logoutはHHMMSSmmm形式で時刻を出力します。 ・各ユーザはloginからlogoutまでの間ログインした状態です。 出力結果としては以下のようなイメージです。 *************************************** user,login,logout,実行ユーザ数 aaaa,095703775,100825968,0 bbbb,095709415,095809695,1 cccc,095732774,095733633,2 bbbb,095734883,095735227,2 aaaa,095735321,095735727,3 dddd,095742555,095743680,2 eeee,095742664,095743102,3 gggg,095743196,095743664,3 tttt,095801070,095804070,2 *************************************** 以上です

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

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

  • 外部ファイルを複数読み込ませて・・・

    複数の****.js(中身は半角数字)を読み込み 中身(数字)を足して表示させたいのですが方法が分かりません。 表示はJavaScliptとして表示させようと思っています。 ファイルが1つの場合は、下記で対応出来るのですが open(IN,"./****.js"); while(<IN>) AAAA.js BBBB.js CCCC.js DDDD.js EEEE.js となる、複数のファイルを読み込ませ 中身の数字を足したものを表示させる方法が分かりません。 ご存じの方のご教授をどうかお願い致します。

    • 締切済み
    • CGI
  • Cシェルでのファイルからの入力について

    あるファイルが最終行になるまでに繰り返し実行するシェルを作りたいです。 とりあえずファイル名を1行ごとに5行程度入れてあるファイル「filemei」を作成しました。 そのファイルからファイル名を順番に取り出し、lsをするものを作ってみたのですが、うまくいきません。 とりあえず、繰り返しにはwhileやforeach、ファイルの読み込みにはawkを使ってみたのですが... どなたか分かるかたがいれば教えて下さい。 無知なので、質問自体が訳が分からない場合があると思いますが、ご勘弁願います。

  • UNIXのシェルについて教えてください。

    UNIXシェル初心者です困っていますので教えてください。 (例) /tmp/test.txtのファイルがあるといたします。 このファイルの中身は、下記のようになっております。 01 一番 一郎 02 二番 次郎 04 三番 太郎 05 四番 吾郎      ・      ・ この中身をUNIXシェルを利用して/tmp/test1.csvに書き出し 内容を下記ように変更したいです。 01 一番 一郎 背番号 01 である。 02 二番 次郎 背番号 02 である。 04 三番 太郎 背番号 04 である。 05 四番 吾郎 背番号 05 である。      ・      ・ 実際に実施した/tmp/test.txtファイルは何百行もあり手動で作成するのは 手間です。 よろしくお願いいたします。

  • ファイルA、ファイルBの各々1行ずつをreadして結合するシェル

    シェル初心者です。 ファイルA、ファイルBの各々1行ずつをreadして結合するシェルを作りたいのです。 ファイルA:  1 2 3 4 5 6 ::::: ファイルB: 7 8 9 10 :::: 結果の結合ファイル: 1 2 3 7 8 4 5 6 9 10 :::::::::: :::::::::: 各ファイルは、列数(=フィールド数)が異なりますが、行数は同じです。 while ~ read のループでは、うまくいきませんでした。 どなたか、よろしくお願いします。

  • ファイルの最後に文字列挿入

    複数テキストファイルの最後に、固定の文字列(1行)を追加したいのですが、batファイルで行う場合は、どのようにすれば良いのでしょうか? 例) AAAA.txt BBBB.txt CCCC.txt (ファイルの中身はそれぞれ異なるが拡張子は同じ)3つのファイルの最後に、 XXXXX=YYYY+ZZZZZ という1行を追加したい。 お手数をおかけします。よろしくお願いいたします。

専門家に質問してみよう