• 締切済み

[awk]でデータ整理がしたいです。

こんばんは この度、研究で膨大なデータをまとめたいのでawkを使おうと思っています。 元のファイルは約1万個あります。 ファイル名は R150km‐1020010001.txt から R150km‐1021800180.txt まであります。 102までは共通でそのあとの数字が変わります。 0010001...0010180 0020001 0020002...0020180.................1800180 といった形です。 中身は、 0 0 0 34 57 69 79 109 ....... といったように1行で8000列の数値データが入っています。 このファイルを下記のように1行目に0010001のファイルの中身、tabで区切って、2行目に0010002のファイルの中身といった形で一つのtxtにまとめたいです。 0 (tab) 0 (tab) 0 ... 34(tab) 28(tab) 36... 57(tab) 67(tab) 53... 69(tab) 78(tab) 72... 79(tab) 89(tab) 88... 109(tab) 99(tab)107 ... ... .... ... 可能でしょうか?ご回答お待ちしております。 よろしくお願いします。 awk初心者なので何か足りないところあったらすみません。

みんなの回答

noname#208507
noname#208507
回答No.6

#4です。すみません。忘れてください。 > for でループしたりする必要はないと思います。 そうでした。

回答No.5

こういう操作はよくあるので、わざわざawkやsedを持ち出すまでもなくて、 Unix系では paste という専用のコマンドがあります。 データのあるディレクトリに移動して、  ls | xargs paste -s >>/tmp/matome.txt で、ディレクトリ/tmpにまとめたものができます。 ls でファイル名をソートしてパイプに渡し、 xargs でファイル名を受け取って、 paste -s で1ファイル1行タブ区切りに変換し、 /tmp/matome.txt にリダイレクトします。 xargs は環境の ARG_MAX まで自動で区切りながら後続のコマンドに引数を渡すので、 for でループしたりする必要はないと思います。

noname#208507
noname#208507
回答No.4

> このコマンドラインのまま使えるのでしょうか? > R150kmのあとのところに何かいれないといけないのでしょうか? このまま使ってください。 (sortの-nは余計だったかもしれませんが、このままでも問題ないでしょう) > データの入ったフォルダなどを指定する必要はないのでしょうか? 現在のフォルダが、データのあるフォルダだと前提を置いて書いてしまいました。 あらかじめ $ cd (データのあるフォルダのパス) を実行して、フォルダを移動してください。 ちなみに $ rm -f data.txt は、ファイル data.txt を削除。 $ for I in ... は I にファイル名を代入してdoからdoneまでくり返し。 xargs < $I は、ファイルの中身を一行に並べて、 sed 's/ /\t/g' >> data.txt は、空白をタブに置き換えて data.txt に追加書き込みをしています。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3
noname#208507
noname#208507
回答No.2

awkではありませんが、端末のコマンドラインから次のように実行すれば、ご希望にかなうのではないかと思います。(この場合、結果は data.txt に出力されます) $ rm -f data.txt $ for I in `ls R150km-*.txt | sort -n` do xargs < $I | sed 's/ /\t/g' >> data.txt done

hugico
質問者

お礼

ご丁寧にありがとうございます!試してみようと思います。 ただ何が書かれているのか理解できなかったので質問させてください、 このコマンドラインのまま使えるのでしょうか? R150kmのあとのところに何かいれないといけないのでしょうか? データの入ったフォルダなどを指定する必要はないのでしょうか? 勉強不足で申し訳ないです。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> 0 > 0 中略 > 109 1列8000行のテキストファイルということだったら、(1)1行めは改行なしで出力。(2)2行め以降は先頭にタブ文字を出力してから、改行なしで出力。(3)最後に改行文字を出力――ってので、いけるかと。 具体的にどこらあたりでつまずいているのかを詳細に説明したほうが回答を得られやすいと思います。 (たとえば複数ファイルの取り扱い方がわからないとかですと、また別の話になります。)

hugico
質問者

お礼

ご丁寧な回答ありがとうございます! ご指摘の通り自分の理解度を示していませんでした、あと1列8000行です、申し訳ありません。 私ができるのは初歩中の初歩で”入力ファイルの1行目+2行目を出力”といったくらいのレベルです。 コマンドラインも awk 'プログラム' 入力ファイル > 出力ファイル しかつかったことありません。  もちろん複数ファイルの取り扱い方もわかりません。 せっかく回答して頂いたのですが、実際どう書けばいいのかわかりません。 勉強不足で申し訳ないですが、学会が迫っているため焦って書き込ませていただきました。 面倒だとは思いますが、できればプログラムの中身を書いていただけると嬉しいです。 よろしくお願いします。

関連するQ&A

  • awkのBEGINについて

    awkのBIGIN内で、データファイルの途中のレコード情報を取得することは可能でしょうか? 以下が行いたい詳細です。 下記例のテキストファイルの”DATE”行をawkスクリプトファイルのBEGIN内で取得したい。 例:test.txt 11111 22222 33333 DATE=20040706 44444 よろしくお願いいたします。

  • awk の使い方

    sample.txt ファイルには   "中村" "08/01/80" "03.1234.5678"   "木村" "08/01/81" "06.1252.2536" のような情報があります。(フィールドの区別はTabです) そこの3番フィールドが電話番号ですので、awkで検索しようと思っています。 それで、 $ shell 06.1252.2536 #!/bin/sh NUM=$1                    #引数をNUMに代入 awk -v ARGU="$NUM" ' { VAR=substr($3,2,(length($3)-2))      #「"」を取り除いた if ( ARGU == VAR ) {print}         #電話番号と比較 }' /sample.txt のようにして、検索をかけようとしましたが、できません。 どこが間違っているのか教えてください。 awkの他の方法があるとか、違うもの(sed or grep)でできるのであれば、お願いします。

  • 複数の空白を一つのタブに変換したいです。awk?perl?

    複数の空白を一つのタブに変換したいです。awk?perl? 以下、 空白を* タブを→で表します。 以下のような内容のファイルがあります。 ******1.00*171.587600 ******2.00*169.399074 ******3.00*175.825399 ******4.00*172.346719 … ***4998.00*165.252400 ***4999.00*166.219166 ***5000.00*166.581150 (場合によっては数万行になります) これを →1.00→171.587600 →2.00→169.399074 →3.00→175.825399 →4.00→172.346719 … →4998.00→165.252400 →4999.00→166.219166 →5000.00→166.581150 ないしは 1.00→171.587600 2.00→169.399074 3.00→175.825399 4.00→172.346719 … 4998.00→165.252400 4999.00→166.219166 5000.00→166.581150 という形に変えたいです。 恐らくperlやawkを用いて出来ると思うのですが、どうすればよいのかわかりませんので教えていただけるとありがたいです。

  • 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で複数ファイルのある列を抽出し出力したい

    awkプログラミングの初心者です。 今、複数ファイル(1000ファイル)から、それぞれある列(すべて同じ列番号)のデータを抜き出して、1つのファイルに出力したいと考えています。 具体的には、1列目に共通項、2列目以降に1000ファイル分の抽出された列を、合計1001列となるような1つのファイルとして出力したいと考えております。 awkを使って出力するには、どのようなスクリプトを作ればよいか教えていただけませんでしょうか。 <イメージ> 元となるファイル(例えば下記のように3ファイル、実際には1000ファイル)があります。 file1.txt: 1  10 2  15 3  17 :  : 1000  25 file2.txt: 1  5 2  40 3  22 :  : 1000  17 file3.txt: 1  9 2  20 3  16 :  : 1000  32 出力後のファイルイメージ: 1  10  5  9 2  15  40  20 3  17  22  16 :  :  :  : 1000  25  17  32 ちなみに、自分で作成したawkスクリプト(下記)では、上記出力後のイメージとは異なり、 縦にデータが結合されてしまいました。 awk `{print $2}` ./file*.txt > Output.txt 出力後のファイル: 10 15 17 : 25 5 40 :

  • 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の値を、数値として代入され、四則演算をさせるにはどうしたら良いですか? 以上、よろしくお願いします。

  • sed,awkでのデータ抽出方法

    教えてください。 awk,sed,シェルを使い、カンマ区切りのファイルの1カラム目と2カラム目をキーに、 あるファイルに含まれる行を削除するにはどうすればよいのでしょうか? 例) --aaa.csv-- 111,222,333,444 555,666,777,888 999,000,111,222 --file1.txt-- 111222 555666 の場合、aaa.csvより下記行のみほしい。 999,000,111,222 ご存知でしたら、ご教授ください。 よろしくお願いします。

  • awkでファイルから特定の行を抽出する方法

    初心者です。 ファイル(a.txt) 2005.12.05 2.5,1.0,a01 5.0,2.0,9.5 2005.12.06 6.5,4.0,3.2 b1,3.0,7.5 2005.12.07 ・ ・ というようなファイルから2、5、8・・・行目を 抜き出しファイル(b.txt)に「awk」又は「perl」で出力する方法を教えて下さい。

  • awkで列指定をして削除

    awkかsedを利用して以下のファイルを処理したいです。 1 2 3 4 5 2 1 3 4 5 1 2 3 4 5 3 1 3 4 5 一列目の値が1の行のみ削除したいです。 2 1 3 4 5 3 1 3 4 5 こんな感じです。 実際に処理するファイルは膨大な行数ががあるためprintでは難しいです。 よろしくお願いします。

  • Bシェルのawkコマンドについて

    Bシェルのawkコマンドについてですが、例えばプロンプトから % ls -l hoge.txt | awk '{print $5}' と入力すると、hoge.txtのファイルサイズが出力されますが、同様のことをBシェルの中で行おうと思っています。 下記のように、配列arrayにはスペース区切りで3つのデータが入っており、N番目のデータを取得したいという場合に、Nに変数を使用して取得する方法がわかりません。 #!/bin/sh array="AA BB CC" num=3 # CCを取得したい echo $array | awk '{print $num}' 上記で実行すると、"AA BB CC"のようにすべて出力されてしまいます。awkで出力する箇所を${数値}で指定すればうまくいくのですが、ランダムで決めた数値(1~3)をnumに入れて取得したい場合、このようなことは可能でしょうか。 もし不可能な場合でも、awk以外に何かコマンドがあればご教授願います。なお、作成するのはBシェルになります。

専門家に質問してみよう