joinコマンドでの結合がうまくいかない問題について

このQ&Aのポイント
  • joinコマンドを使用して結合する際、指定したファイルの特定の範囲までしか結合されない問題が発生しています。
  • 実行したコマンドを例として挙げると、join -a1 tes1 tes2のように使用しました。
  • 問題の原因や解決策について、経験のある方のアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

joinコマンド

joinコマンド 自宅環境で再現できないのですが、 # cat tes1 1 2 3 4 5 ・ ・ ・ 110 # cat tes2 3 27 4 18 9 18 17 100 19 20 33 55 ・ ・ ・ 110 28 # join -a1 tes1 tes2 と実行したときに、tes2の10以下の数字までしか結合されず 1 2 27 3 18 4 18 5 6 7 8 9 19 10 11 ・ ・ ・ 110 のように表示されてしまいます。 もともとのtes1,tes2はsqlの結果を整形、タブ区切りにしています。 問題の起きたコードそのままではないのですが、 似たような経験をした方や、コマンドに詳しい方がいましたら、 原因についてアドバイス頂けると幸いです。

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

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

join の入力ファイルはソートされていなければなりません。 3 27 4 18 9 18 17 100 19 20 33 55 をsortすると、 17 100 19 20 3 27 33 55 4 18 9 18 になるのはわかりますか? 一旦、sort して join してから、結果を sort -n するんでしょうね。

s_h_i_b_a
質問者

お礼

お礼が遅くなりましたが、回答ありがとうございます。 確かにsortを忘れていました。 ただa,b,cとファイルがあって、 join -j 1 a bは失敗するんですが、何故join -j 1 a cは成功していたんですよね。 とりあえず解決したんで、いずれ追々その辺の疑問は解消していきたいと思います。 有難うございました!

関連するQ&A

  • joinの-eオプション

    joinの-eオプション 表題そのままですが、joinの-eオプションは 入力が無い場合の文字を決定するとありますが、 いろいろ試してみましたが、使い方がわかりません。 $cat tes1 1 2 3 4 5 6 #cat tes2 1 10 2 20 4 40 のようなファイルを 1 10 2 20 3 0 4 40 5 0 6 0 のように結合したいと思っています。 -e のオプションで可能でしょうか? もし不可能ならどのような方法があるでしょうか?

  • 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++だと助かります。よろしくお願いします。

  • 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)で合ってますでしょうか。プログラミングと迷ったのですが・・・。

  • INNER JOINとwhere句

    等結合のSQLを書く必要が出てきた場合、 INNER JOINとwhere句 どちらを使用されてるか教えて頂けないでしょうか? 私は、結合表の数が多くなってくると INNNERのSQLはぱっと見て見にくいと想いWHEREを使っているのですが。 (何より、WHEREのほうが構文が簡単で・・・。) よろしくお願いします。

  • LEFT JOINの条件式で=’’を使用した場合

    以下のSQLを実行した場合、レコードを1件取得して欲しいのですが、 なぜか上手く取得できません。 ご存知の方がいらっしゃいましたら、教えてください。 -- SQL1 --------------------------------------------------- select   MAIN.MAIN_NAME,   nvl(SUB1.CODE is NULL, 0) as SUB_CODE1,   nvl(SUB2.CODE is NULL, 0) as SUB_CODE2 from   MAIN_TABLE MAIN    left join SUB_TABLE SUB1 on MAIN.CODE = SUB1.CODE                    and SUB1.ZYOUKEN = '1'    (1)    left join SUB_TABLE SUB2 on MAIN.CODE = SUB2.CODE                    and SUB2.ZYOUKEN = ''     (2) where   MAIN.CODE = 'XXX' ----------------------------------------------------------- 質問1. どうも、(2)の部分を空文字(?)ではなく何か値を入れると正常に1件 取得できるようなのですが、なぜ外部結合しているにもかかわらず 0件になってしまうのかが良く分かりません。 質問2. やはり条件に空文字を使用するのはよろしくないでしょうか? ※補足 念のため、以下のSQLを実行したところ、こちらは問題なく1件取得 できているので、抽出条件は間違っていないです。 -- SQL2 --------------------------------------------------- select   MAIN.MAIN_NAME from   MAIN_TABLE MAIN where   MAIN.CODE = 'XXX' ----------------------------------------------------------- 以上です。宜しくお願いします。

  • LEFT JOIN あいまいな外部結合

    Access2000でクエリを作成します。 SQLで SELECT お支払.ID_支払, お支払.N_伝票No, お支払.N_支払金額, お支払.N_支払区分コード FROM 伝票 LEFT JOIN (支払区分マスター INNER JOIN お支払 ON 支払区分マスター.N_支払区分コード = お支払.N_支払区分コード) ON 伝票.N_伝票No = お支払.N_伝票No; とすると あいまいな外部結合が含まれている・・というエラーがでてしまいます。どうしたらいいでしょうか。 伝票は全て表示して、その中のお支払には、区分コードを割り当てたいだけなのですが。 宜しくお願い致します。

  • SqlDataSourceについて

    現在Visual Web Developer 2008で開発を行っています。 そこで質問なのですが、DBよりSqlDataSourceを通してテーブルデータを読み込み、GridViewにて表示させています。 しかし、そのテーブルを結合しなくてはならなくなりました。この場合SqlDataSourceには複数のテーブルを選択することは出来ないのでしょうか? また出来ない場合はカスタムにしてSELECTタブにjoin等で結合したSQL文を書くことになるのでしょうか?それともコード上に記載するのでしょうか? よろしくお願いいたします。

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • ファイルから直接SQLを実行するコマンドを教えてください。

    SQL文を書いて保存してある C:\SQL\abc.sql というファイルがあるとします。 これを直接実行したいんですが、どういうコマンドを打てば良いのかわかりません。 誰かわかる方は教えてください。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • WHERE句はJOIN結合前結合後どちらに効くのか

    以下の2つのSQLを比較してどちらがパフォーマンスが良いでしょうか。 先に抽出して結合した方が良いと昔聞いた事がありましたが 記憶があいまいになってしまいました。 (1) SELECT * FROM A JOIN B ON A.*** = B.*** WHERE A.*** = '0001' (2) SELECT * FROM (SELECT * FROM A WHERE A.*** = '0001') AS A JOIN B ON A.*** = B.***