• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:すいません、とある課題でawkに挑戦しなければならなくなったのでが )

awk初心者の私が困っていることとは?

このQ&Aのポイント
  • awk初心者の私が、固定長のファイルを処理する方法に悩んでいます。
  • 特に、ファイル1とファイル2の数字部分を比較する方法がわかりません。
  • ファイルの内容を結合する際にも、スペースの処理に苦労しています。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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()関数を使って必要なところを 切り出して使います。 スクリプトのここが分からないという質問には答えますが実は問題はこうだったので 書き直せというリクエストはお断りしたいです。 組み込み関数の仕様などは検索すればすぐに見つけられます。

yxia001
質問者

お礼

有難う御座います。 自分の、勉強不足が良くわかったので、勉強しなおします。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

あー、awk の動作をだいぶ勘違いされているようですね。 入力を同時に並行して二つのところから得ようとするのは結構面倒ですよ。 あともうひとつ確認。 file2 の方には file1 の 01 や 02 などに対応する行が複数あるのですね? つまり、file1 の 01 の行から切り出したのをくっつけるのは file2 の 01001 iiiiiiiiijjjjjjjjjおおおおお 01002 kkkkkkkk lllllllllかかかかかか の二行で、以下同様に02, 03, ... と繰り返すと。

yxia001
質問者

補足

そうですね。上2桁をキーにしてfile1とfile2でマッチングをかけて、同じものにfile1のひらがな部分をfile2のひらがな部分の前にくっつけるという感じです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

awkでやらなければってありますけど、FIRLDWIDTHS使った固定長の分割って gawk固有の拡張ですがいいんでしょうか? >スペースが途中に入ると区切りがうまくいかないので、なかなか処理できません。 そのうまくいかないというのでよいのでスクリプトを見せてください。 あ、あと使っている環境(OSなど)もお願いします。 ひらがなとかあるとその辺面倒があったりするので。

yxia001
質問者

補足

一応書いたソースは 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系のサーバを使っているます。 最後のひらがな部分は漢字とひらがなもあります。

関連するQ&A