• 締切済み

[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 'プログラム' 入力ファイル > 出力ファイル しかつかったことありません。  もちろん複数ファイルの取り扱い方もわかりません。 せっかく回答して頂いたのですが、実際どう書けばいいのかわかりません。 勉強不足で申し訳ないですが、学会が迫っているため焦って書き込ませていただきました。 面倒だとは思いますが、できればプログラムの中身を書いていただけると嬉しいです。 よろしくお願いします。