UNIXコマンドjoinの使用に関する質問

このQ&Aのポイント
  • UNIXコマンドjoinを使用して2つのファイルを結合しようとしていますが、一列目の数字が急に変化するとそれ以降の行が出力されません。
  • どのようにすればこの問題を防ぐことができるのでしょうか?
  • もしくは、2つのファイルの一列目の数字が同じ場合に結合して出力してくれるプログラムを書ける方がいたら教えていただきたいです。perlかC++でお願いします。
回答を見る
  • ベストアンサー

UNIXコマンドのjoinについて

-------------- -------------- 1 XX XXX 1 xx xxx 2 YY YYY 2 yy yyy 3 ZZ ZZZ  3 zz zzz ~      ~ -------------- -------------- UNIXコマンドのjoinを用いて上の二つのファイルを結合させ、 ---------------------- 1 XX XXX xx xxx 2 YY YYY yy yyy 3 ZZ ZZZ zz zzz ~ ---------------------- としたかったのですが、一列目の数字が急に変化するとそれ以降の行が出力されなくなります。(例えば、100の次が1000になった時など) どのようしたらこのような事が防げるのでしょうか? もしjoinでは防げないなら、joinのように2つのファイルの1列目の数字が同じだった時に結合して出力してくれるプログラムを書ける方がいたら教えていただきたいです。 perlかC++だと助かります。よろしくお願いします。

  • kjng
  • お礼率33% (3/9)

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

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

joinは、両方のファイルをそれぞれjoinするフィールドでソートしておかないといけませんが、されてないのでは? 数値としてのソートじゃ無くて、文字のソートなので、1 → 10 → 100 → 11 → 12 → 2 → 20 などという順です。 sort file1 > file1.tmp sort file2 > file2.tmp join file1.tmp file2.tmp | sort -n と、一旦文字順でソートして、join後に数値でソート

kjng
質問者

お礼

回答ありがとうございます。 文字順でソートしなければならなかったんですね… 文字順でソートし直したらしっかりとできました! ありがとうございました。

その他の回答 (2)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

なるほど、ずれたり急に桁上りすると妙な挙動しますね。 欲しい動作はこんな感じでいいのかな? awk '{while($1>a[1]){getline x<"j1.txt"; split(x,a);} if($1==a[1])print $0,a[2],a[3]}' j2.txt

kjng
質問者

お礼

awkは使ったことがありませんでしたが、この際に勉強して使えるようになりたいと思います。 実際にこれを動かしてみると、計算が終わらないのですが… もう少し勉強していろいろいじってみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

何を期待しているかわからないんだけど -a とか?

関連するQ&A

  • CSVファイルの""内コンマの処理

    以下のようなCSVファイルがあります。 xxx,yyy,"z,zz",XXX,"YY,Y",ZZZ,111,222 これを、 xxx,yyy,zzz,XXX,YYY,ZZZ,111,222 の様にperlで ""内のコンマを取りたいのですが、どうしたらよいでしょうか? xxx,yyy,z zz,XXX,YY Y,ZZZ,111,222 の様に""内コンマを別の文字に置き換えても可です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • unixのコマンドでSQLのようにJOINする

    unixのコマンドでSQLのJOIN(直積)と同じことをする方法はありますか? やりたいのは同じ結合キーが複数行ある場合です。 入力ファイル1(結合キーは1列目) 1,AAA 2,BBB 2,CCC 3,DDD 入力ファイル2(結合キーは1列目) 1,PPP 2,QQQ 2,RRR 出力結果 1,AAA,PPP 2,BBB,QQQ 2,BBB,RRR 2,CCC,QQQ 2,CCC,RRR 結合キー「2」は入力ファイル1にも入力ファイル2にも2行づつ存在するので SQLのJOINと同じように組み合わせのパターン全部を出力し、 結合キー「3」は入力ファイル2には存在しないので出力したくありません。 もし簡単なコマンドがなければawkやperlを使うしかないでしょうか・・・。 環境はHitachi系のunixだったと思います(うろ覚え) ちなみにこういう質問はこのカテゴリ(Linux系OS)で合ってますでしょうか。プログラミングと迷ったのですが・・・。

  • メール送信エラーでメールが返信されてしまいます

    メール送信エラーで以下のメッセージでメールが返信されてしまいます。 何が原因かお分かりの方いましたらご回答お願いします。 ======ここから=============== Your message was not delivered to the following recipients: --address suppressed-- : Message filter exited with abnormal status 127 (original address:xxx@xxx.xx.xxx.xxx) __________________________________________________ Reporting-MTA: dns;yyy.yy.yyy.yyy Original-Recipient: rfc822;zzzz@zzz.zz.zzz.zzz Final-Recipient: rfc822;--suppressed--:; Action: failed Status: 5.2.0 __________________________________________________

  • シェルスクリプトにてファイルの結合

    お世話になります。 ある3つのファイルfile1 file2 file3 の内容が file1が 111 222 333 file2が aaa ddd bbb eee ccc fff file3が xxx yyy zzz という内容を file4に 111 aaa ddd xxx 222 bbb eee yyy 333 ccc fff zzz という具合に横に結合させて出力させたいのですが どうしていいか分かりません。 sedとかawkを使えばいけそうなんですが 分かる方いらっしゃいませんか??? 宜しくお願いいたします。

  • EXCEL 抽出について

    EXCELで 必要な情報を抽出したいですが、 例:  表 ID  名前       1.XX小説  2.XXX本  3.ZZZ本 4.YYY本 1   山田 XX       1                1 2   鈴木 XX               1 1 3   渡辺 XXX 4   吉田 XX       1                       1 こちらで 1~4まで本の名前で この本を持っていると1 持ってないと何もなしで、 下記のように抽出したいです。 結果: 1.XX小説  山田 XX 1.XX小説  吉田 XX 2.XXX本 鈴木 XX 3.ZZZ本   山田 XX  4.YYY本  鈴木 XX 4.YYY本  吉田 XX どのようにすればよいのでしょうか? 何かお分かりの方がいましたら教えてください。よろしくお願いします。  

  • CGIからの絶対パス

    こんにちは。 perlのCGIでファイルをオープンする際のパス指定で悩んでいます。 cgiとは別のディレクトリにあるファイルをオープンしたいのですが、 このとき、 open(IN,"/home/XXX/YYY/ZZZ.dat"); というふうに絶対パスでオープンしようとすると、オープンできません。 一方、 open(IN,"../../../home/XXX/YYY/ZZZ.dat"); といった感じに相対パスにすると、オープンできます。 ファイルの場所は/home/XXX/YYY/ZZZ.datで間違いありませんし、 cgiとしてではなく、シェルから直接cgiプログラムを起動すると、 絶対パスでもオープンできます。 これはいったいどういうことが起こっているのでしょうか? ご存知の方、ご解説願えないでしょうか。

    • ベストアンサー
    • CGI
  • 【Ruby】改行挿入 文字列操作

    以下の様な文字列を <div>xxx</div>yy<span>zzz</span> 以下の様に編集したいです。 <div>xxx</div> yy <span>zzz</span> htmlのタグ毎に改行を挿入したいのです。 もしも上記例でyyがなければ以下の様に書くのですが、 require 'drb/drb' puts DATA.read.scan(/(<.+?>.+?<\/.+?>)/).join("\n") __END__ <div>xxx</div>yy<span>zzz</span> 以上、よろしくご指導の程、お願い申し上げます。

    • ベストアンサー
    • Ruby
  • エクセルVBAでテキスト保存

    エクセルのファイルをメモ帳で保存する場合に下記のコードが書いてあります。 strFILENAME = xlAPP.GetSaveAsFilename(InitialFileName:="データxxx_yyy_zzz.txt",FileFilter:=cnsFILTER, Title:=cnsTITLE) このうち、ファイル名の"データxxx_yyy_zzz.txt"、xxx, yyy,zzzをそれぞれ、特定のセルから取得したい場合、どのように直せばいいのでしょうか? xxx=A1セル yyy=A2セル zzz=A3セル といった感じです。 よろしくお願いします。

  • MAILサーバが応答しなくなって困っています。

    外部公開をしているメールサーバから応答がなくなりました。 その時点で私の知る限りでは、強制再起動しか打つ手がなく強制再起動を行いました。 (マジックSysRqキーを使用し、[Alt]+[SysRq]+[s]⇒[u]⇒[b]で再起動しました。) 環境と現象は以下のとおりです。 [環境]  OS:CentOS release 4.5 (Final)  kernel:2.6.9-42.0.3.EL  RAID:Software RAID1  主なDemon:     ・bind-9.2.4-24.EL4 (外部向け)     ・sendmail-8.13.1-3.2.el4 (SMTP/SMTPS) (外部向け)     ・dovecot-0.99.11-8.EL4 (POP3/POP3S/IMAPS) (内部向け)    ※ clam-milterとspamass-milterを導入し、ウィルス/スパムメール対策中です。 [現象]  02:35頃 POP3の応答がなくなる  09:30頃 サーバの応答がないことに気がつく  09:50頃 PINGによる疎通確認 ⇒ Windows端末で実施し、応答がありました。      SSH接続 ⇒ ID/PASS入力後、反応なし。      コンソールログイン ⇒ ID/PASS入力後、反応なし。  10:05頃 マジックSysRqキーによる強制再起動      再起動後、MAILとDNSのサービス等を確認  その後ログを確認  [messages]   02:00:57 hostname clamd[9214]: Reading databases from /var/clamav   02:02:39 hostname clamd[9214]: Database correctly reloaded (235710 signatures)   02:13:25 hostname clamd[9214]: SelfCheck: Database status OK.   02:34:01 hostname named[2434]: lame server resolving 'XXX.XXX.XXX.XXX.in-addr.arpa' (in 'XXX.XXX.XXX.in-addr.arpa'?):XXX.XXX.XXX.XXX#53   02:33:58 hostname named[2434]: client XXX.XXX.XXX.XXX#3143: updating zone 'mydomain.com/IN': update failed: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET)   02:33:58 hostname named[2434]: client XXX.XXX.XXX.XXX#3146: update 'mydomain.com/IN' denied   10:06:36 hostname syslogd 1.4.1: restart.  [maillog]   02:33:03 hostname pop3-login: Login: user1 [YYY.YYY.YYY.YY1]   02:33:09 hostname pop3-login: Disconnected [ZZZ.ZZZ.ZZZ.ZZZ]   02:33:29 hostname sendmail[27371]: l5THXT9t027371: [ZZZ.ZZZ.ZZZ.ZZZ] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA   02:34:00 hostname pop3-login: Disconnected [ZZZ.ZZZ.ZZZ.ZZZ]   02:33:59 hostname pop3-login: Login: user2 [YYY.YYY.YYY.YY2]   02:33:59 hostname pop3-login: Login: user3 [YYY.YYY.YYY.YY3]   02:33:58 hostname pop3-login: Login: user1 [YYY.YYY.YYY.YY1]   02:34:01 hostname sendmail[27394]: l5THY14p027394: ppp-XXX-XXX.XX-XXX.iol.it [XXX.XX.XXX.XXX] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA   02:33:58 hostname sendmail[27402]: STARTTLS=server, relay=[ZZZ.ZZZ.ZZZ.ZZZ], version=TLSv1/SSLv3, verify=NO, cipher=DHE-RSA-AES256-SHA, bits=256/256   02:34:01 hostname sendmail[27419]: ruleset=check_relay, arg1=[XXX.XXX.XXX.XXX], arg2=127.0.0.4, relay=[XXX.XXX.XXX.XXX], reject=550 5.7.1 Rejected: XXX.XXX.XXX.XXX listed at all.rbl.jp   10:06:43 hostname dovecot: Dovecot starting up  [cron]   02:01:01 hostname crond[26912]: (root) CMD (run-parts /etc/cron.hourly)   02:10:01 hostname crond[27069]: (root) CMD (/usr/lib/sa/sa1 1 1)   02:20:01 hostname crond[27236]: (root) CMD (/usr/lib/sa/sa1 1 1)   02:30:01 hostname crond[27344]: (root) CMD (/usr/lib/sa/sa1 1 1)   10:06:57 hostname crond[2868]: (CRON) STARTUP (V5.0)  上記のとおり、サービスが応答しなくなってから再起動までログには何も記録されていません。 ※ 今回はじめて発生した現象です。 原因も対策方法もわからず困っています。 この現象は、  ・外部からの攻撃が原因なのでしょうか?  ・OSまたはDEMONのバグ等なのでしょうか? この現象にどのような対策を講じればいいでしょうか? 何か情報をお持ちの方がおられましたら、教えていただけないでしょうか?

  • awkで二つのファイルを比較し出力する方法

    UNIXで二つのファイルを使って別ファイルを出力する 処理をしたいのですが、awkで二つのファイルを扱う方法 が分かりませんでした。 やりたい処理は以下のような事です。 ファイルAの1行目"AAA B"と同じ行がファイルBにあったら、ファイルAの"AAA B"の次の行に、 ファイルBの次の行"YYY bbb"を挟み込みます。 もし、ファイルBに同じ行がなかったら、 ファイルAの次の行に"NG"を挟み込みます。 [ファイルA] AAA B ZZZ B AAA C ZZZ C AAA D ZZZ D [ファイルB] AAA B YYY bbb AAA C YYY bbb [出力ファイル] AAA B YYY bbb ZZZ B AAA C YYY ccc ZZZ C AAA D NG どなたか良いスクリプトありましたら 教えていただけないでしょうか。 よろしくお願いします。

専門家に質問してみよう