• ベストアンサー

AWKの配列内データの処理について

AWKを使用して入力ファイルの1行内の単語に対して条件チェックするには for( i=1 ; i<= NF i++ ){    if( $I == chek_word )       処理 } とすればできるのはわかるのですが、 一旦、配列の中に格納した文字列に対して上記の処理と同様の処理をするにはどのようにすればいいのでしょうか? 例えば data_line[$1] = $0; として配列data_lineに格納した1行そのままのデータに対して1番上の行全体にわたる単語の条件チェック をおこないたいのですが、どのようにすればいいのかよくわかりません。 どなたかご存知の方アドバイスをお願いします。

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

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

>data_line[$1] = $0; $1が同じだと上書きされますがいいんでしょうか? まあ、それはそれとして、 for ( line in data_line ) { nf = split(line, term, FS); for ( i=1; i<nf ; i++ ) { if ( term[i] == check_workd ) { // 処理 } } } のようなことをしたいという意味でいいんでしょうか。 チェックしてませんので、間違いあるかも知れませんので、 関数等調べてからお使いください。

その他の回答 (2)

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

#2です。 つい間違ってしまいました。 for(line in data_line) {  $0=data_line[line]  for(i=1;i<=NF;i++){   if($i==chek_word)      処理  } } です。#1の方の回答も nf = split(data_line[line], term, FS); です。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

#1の方の回答で >for ( i=1; i<nf ; i++ ) { は for ( i=1; i<=nf ; i++ ) { ですね。 他の方法としては、 for(line in data_line) {  $0=line  for(i=1;i<=NF;i++){   if($i==chek_word)      処理  } } この場合、$0 が破壊されるので必要なら事前に退避してあとで戻す必要がありますが、多分END{ }内での処理でしょうからそのままでいいでしょう。

関連するQ&A

  • [arduino]数値の大きなデータを二次配列へ

    シリアル通信で得たデータを二次元配列へ格納するために、 以前では、 if(Serial.available()>120){ for(int k=0;k<8;k++){ for(int l=0;l<15;l++){ //読み込んだ値を配列に代入 matrix[k][l]=Serial.read(); } } } このようなやり方で読み込んだ値を二次元配列に代入していたのですが、 128個以上のデータを扱いたい場合、Serial.availableでは保持できず、困っています。 方法として、 (1)一つずつデータを読み込み、128回ループを繰り返し配列に貯めていく。その後配列を2次元配列に代入する。 (2)一つデータを読みこんだら二次元配列の1行目1列目のドットに格納、もう一つデータを読みこんだら二次元配列の1行目2列目のドットに格納…というように、 読みこんだデータをそのまま二次元配列のそれぞれの場所へ格納していく。 というような二つの方法を思いついたのですが、 (1)の方法では、配列にデータを貯蓄していくコードをこのように↓書いたのですがうまくいかず、 for(int i=0;i<128;i++){ if(Serial.available()>0){ data[128] = Serial.read(); } } (2)の方法では、データを二次元配列のそれぞれの場所へ格納していく指定方法が分かりませんでした。 正しい書き方や、良いアイデアをお持ちの方がいましたら、是非御教授お願いします。

  • String配列を扱うアルゴリズムについて

    よりパフォーマンスの良いアルゴリズムが、 ございましたらご教示下さい。 数レコード分のDBテーブルデータが格納されたString[][]型が存在するとします。 配列の要素は、String[行(フィールド)][列(カラム)]です。 ここで、全レコード中の列ごとの最大文字列長を int[]型に取得したいと思います。 そうした場合、自作した下記の処理よりも、 よいパフォーマンスを得られるアルゴリズムがございましたら、 ご教示願いたいと思います。 ※処理前提条件 ●String[][]型変数に、過不足無くテーブルデータが格納済みであるとします。 ●配列の第一(行)・第二(列)要素の最大値は取得済みであるとします。 ////////////// // 変数定義 // ////////////// String[][] tableData; ← テーブルデータ格納済み(過不足はありません) int 行数 = 全行数(取得済み); int 列数 = 全列数(取得済み); //列毎の最長文字列値を格納する。 int[] maxLen = new int[列数]; ////////// // 処理 // ////////// //列の個数分、処理を繰り返す for(int i = 0; i < 列数; i++) {   //行の個数分、処理を繰り返す   for(int j = 0; j < 行数; j++) {     //NULLを回避する     if(tableData[i][j] != null) {       //int配列に格納済みの数値より大きければ、改めて格納する       if(maxLen[i] < tableData[i][j].length()) {         maxLen[i] = tableData[i][j].length();       }     }   } } 以上です、どなかお知恵をお貸し頂けませんか。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • ExcelVBAでの配列処理について

    処理速度向上を目的に配列を利用したいのですが、結果の書きだし処理で悩んでいます。 Dim aa(10000,2) as Double for i = 1 to 10000 for j = 1 to 2 aa(i,j)=Rnd() next j next i 上記の処理で、10000行と2列の乱数表データが配列として出来、そのデータをシートに書き出しするときに、列を2つほど飛ばして書き出したいのですが、どうすればよいのでしょうか? range("A1:B10000") = aa  という連続した列ではなく、A列に1万行、D列に1万行書き出したいと思っています。 処理速度を向上させたいので、またFor分処理するのではなく、一気に書き出したいと思っています。 ご教授のほどよろしくお願い申し上げます。

  • VBA配列 印のついた列番号を格納して利用したい

    Excel VBAで下記処理を作成しました。配列を使えば処理が高速化できるのでは?と思い調べたのですが、配列を使ったことが無く、挫折しましたのでどなたかご教示いただけませんでしょうか。 <対象データ>(添付画像の黄色いセルが処理対象) ・処理対象の行は「区分」列に「0」が入っている ・処理対象の列は、1行目に「●」が入っている <作成した処理> ・ループ(1):データ開始行(画像では3行目)から順に見ていく  ・IF:「区分」列が「0」なら下記に進む(0以外なら次の行へ)   ・ループ(2):列を左から順に見ていく    ・IF:その列の1行目が「●」なら処理を行う For i = 3 To 10000 If Cells(i , 1) = 0 And Cells(i , 1) <> "" Then その行に対する処理の下準備のコード(記載省略) For j = 2 To 500 If Cells(1 , j) = "●" Then Cells(i , j)に対する処理(記載省略) End If Next j End If Next i <問題点> データ量が数千行×数百列と相応にあるため、処理実行に数秒かかります。今後、処理をより複雑にしたいため、高速化できないかと考えています。 <質問> 対象行について毎回、ループ(2)で各列の1行目を調べて●だったら処理する、としているのが非効率かも知れないと思いました。 1行目に●が入っている列番号を調べるのは1度で良いので、それを配列に格納して、ループ(2)の部分で使うことはできますでしょうか? ご存じの方、ご教示いただけますと幸いです。よろしくお願いいたします。

  • AWK ファイル読取後の配列処理について

    AWK初心者です。 使用環境 Linux7.3 改行された以下のファイル(num.txt)があります。 873 876 890 892 1405 このファイルをAWKスクリプトから読込み、配列name[]に代入したいのですが、データが重複して配列を構成してしまいます。 自作では、下記のようになりましたが、希望する結果には程遠いです。 修正点等、アドバイスを宜しくお願いします。 -自作- awk -F , '{  name[FNR] = $0;  for(i = 1; i <= FNR; i++)   {    print name[i];   } } ' num.txt -結果- 873 873 876 873 876 890 873 876 890 892 873 876 890 892 1405 -希望結果- 873 #name[1] 876 #name[2] 890 #name[3] 892 #name[4] 1405 #name[5]

  • 一行データから構造体・配列への格納処理について

    初めて投稿します。 ▲実現したい処理内容 1)ファイルを読み込む。 2)読み込んだデータを独自定義した構造体データ配列に格納する。 3)格納した構造体データをパラメータに引き渡す。 ▲ファイルデータについて ・連続した文字列(カンマなどの区切りはなし) ・一行のみ --------10--------20--------30 abcdefgあいうえ123456789012 ▲条件 構造体を使う以外になし ▲状況 今のところ、自分でわかっているのは >2)読み込んだデータを独自定義した構造体データ配列に格納する。 の処理で、 ************************************************************** <最終的に渡すパラメータの型やサイズは決まっているので、 決まった文字サイズでデータから文字を切り出し、操作して パラメータへ渡す>処理で実現できる ************************************************************** なんですが、 構造体を使うロジックで実現しようとし、 関数は freadが適当であるということをアドバイスされましたが、 リファレンスの内容が理解できず困っています。 ファイルを開いて、 char buffer[256]; fgets(buffer, sizeof(buffer), fp); でbufferに文字列を格納する部分までは実現&理解できております。 ご教示いただければ幸いです。 よろしくお願い致します。

  • Excel2003、配列から、複数の条件一致する行のデータを取り出す方

    Excel2003、配列から、複数の条件一致する行のデータを取り出す方法 配列は最大で10行、10列程度ですが、このデータはリアルタイム(0.5秒間隔)で更新されますので、 分類等はできません。 A列のデータがZ1のセルのデータと一致し、かつ、B列は、特定の”文字列”と一致し、かつ、C列は数量で、0より大きい(負のデータは無いが、""はあり得る)という条件に合致した行があったら、その行のD列の値をZ2のセルに格納したい。 条件に合致する行は複数あり得るが、そのときは最初に条件が合致した行のデータが必要。 いくつかの関数を調べましたが、つまづいています。

  • 読み込んだデータを配列へ代入する方法

    ---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • 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} ' [ファイル名] 文法的に誤っていますでしょうか?? 回答宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 配列データの書換え

    お世話になっております。 タイトルにある「配列データの書換え」ですが、あるデータ用ファイル(data.txt)というのがあり、 2009-07-07 ○○@○○.com たけし no 2009-07-07 △△@○△.net ゆみこ no 2009-07-08 ○△@□○.org ひろし ok ※全角スペースの箇所は、タブ区切りとなっています。 と構成されているファイルを呼び出し、条件にて処理を行いたく、呼び出したデータ(data.txtのデータ)を配列にし、 for($i;$i<count($datafile);$i++){  $data = explode("\t", $datafile[$i]);   if($data[3] == "ok"){//ok,noだけではなく、他の条件も含めて条件処理を行っている    $str = "no";    $up_data[] = $data[0]."\t".$data[1]."\t".$data[2]."\t".$str;   } } とこんな感じで記述してみました。 これは、if文の中で条件が合致していたら、名前の後(data.txt)にある「no」を「ok」とし、 その書換えたデータをもとに、data.txtをも上書きしたいと考えているのですが、 この方法だと、data.txtのデータが増えて来たとき、効率が悪いように思えてなりません。 上記のような流れの処理を行い、元のファイルのデータを処理&上書きするもっと効率のよい スクリプトはどんな感じになるのでしょうか。 上手く説明できずに、また説明が不十分なところがあり恐縮ですが、アドバイスのほど頂戴出来れば幸いです、 宜しくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう