- ベストアンサー
awk初心者の私が困っていることとは?
- awk初心者の私が、固定長のファイルを処理する方法に悩んでいます。
- 特に、ファイル1とファイル2の数字部分を比較する方法がわかりません。
- ファイルの内容を結合する際にも、スペースの処理に苦労しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、file2で必要になるのは行の先頭二桁の数字と、行丸ごとなのでフィールド分解は 忘れます。 次に比較のためのfile1の情報をどうするかですが、メモリに余裕があれば (今ならメモリ不足の心配はまずいらないでしょう)最初にまるごと配列に読み込むのが 良いと思いますが、今回はそうしないでgetlineという組み込み関数を使って ちまちま必要に応じて読むことにします。 で BEGIN { file1 = ARGV[1] ARGV[1] = "" } { if (num < substr($0, 1, 2)) { getline t < file1 num = substr(t, 1, 2) pastedata = substr(t, 1+2+1+9+9, 15) } if (num == substr($0, 1, 2)) print $0 pastedata } こんな感じでとりあえず質問に貼られているデータは処理できると思います。 FIELDWITHSにまかせるのではなくて、自分でsubstr()関数を使って必要なところを 切り出して使います。 スクリプトのここが分からないという質問には答えますが実は問題はこうだったので 書き直せというリクエストはお断りしたいです。 組み込み関数の仕様などは検索すればすぐに見つけられます。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
あー、awk の動作をだいぶ勘違いされているようですね。 入力を同時に並行して二つのところから得ようとするのは結構面倒ですよ。 あともうひとつ確認。 file2 の方には file1 の 01 や 02 などに対応する行が複数あるのですね? つまり、file1 の 01 の行から切り出したのをくっつけるのは file2 の 01001 iiiiiiiiijjjjjjjjjおおおおお 01002 kkkkkkkk lllllllllかかかかかか の二行で、以下同様に02, 03, ... と繰り返すと。
補足
そうですね。上2桁をキーにしてfile1とfile2でマッチングをかけて、同じものにfile1のひらがな部分をfile2のひらがな部分の前にくっつけるという感じです。
- sakusaker7
- ベストアンサー率62% (800/1280)
awkでやらなければってありますけど、FIRLDWIDTHS使った固定長の分割って gawk固有の拡張ですがいいんでしょうか? >スペースが途中に入ると区切りがうまくいかないので、なかなか処理できません。 そのうまくいかないというのでよいのでスクリプトを見せてください。 あ、あと使っている環境(OSなど)もお願いします。 ひらがなとかあるとその辺面倒があったりするので。
補足
一応書いたソースは BEGIN{ FIELDWIDTHS="2 9 9 9 15" } FILENAME == ARGV[1]{fdata[$1] = $5} FILENAME == ARGV[2]{print$1 $2 $3 $4 fdata[$1]$5} unix系のサーバを使っているます。 最後のひらがな部分は漢字とひらがなもあります。
お礼
有難う御座います。 自分の、勉強不足が良くわかったので、勉強しなおします。