0

それで、私の最後の質問は十分に具体的ではありませんでした、そして私はかなり近くにいますが、私はまだ私の3つのテキストテーブルを意味のある方法で結合することに問題があります。さて、ここでより詳細にそれらは次のとおりです:

T1_01=表1

 No  Object     CCmax    Vhel    cont  noise    Mag1  
001  _P10644    0.816  123.04  2450.3   74.2   15.34    
002   Parked  -99.900  -99.90   -99.9  -99.9  -99.90  
003  _P10569    0.791  146.30  2650.7   75.3   15.50   
004  _P10769    0.641  141.49   482.7   30.2   16.42  
005  _P10572    0.848  138.15  2161.4   46.3   15.85  

T1_02=表2

Fibrel       Namel  Typel  Pivl         RAl        DECl   Magl  
   001   F1_P10644      P     1  4.89977691  -0.5104696   15.3  
   002      Parked      N     2  4.88965087  -0.4904939    0.0   
   003   F1_P10569      P     3  4.89642427  -0.5099916   15.5  
   004   F1_P10769      P     4  4.90643599  -0.5112466   16.4  
   005   F1_P10572      P     5  4.89644907  -0.5105655   15.8  

T1_03=表3

Name                       RA                 DEC  Imag       Fieldname fiber      RV    eRV                                                               
F1_P10644   4.899776910023531  -0.510469633262908 15.34   100606F1red   001  122.47   2.94  
F1_P10569   4.896424277974554  -0.509991655454702 15.50   100606F1red   003  145.55   2.72  
F1_P10769   4.906435995618358  -0.511246644149622 16.42   100606F1red   004  116.28  12.87  
F1_P10572   4.896449076194342  -0.510565529409031 15.85   100606F1red   005  136.15   3.01   

私が望んでいるテーブル出力は次のとおりです。

T1_0123(列1 T1_01、列1 T1_02、および列6に参加T1_03

 No   Object  CCmax    Vhel    cont   noise    Mag1  Fibrel      Namel   Typel  Pivl         RAl        DECl   Magl       Name                   RA                  DEC    Imag     Fieldname fiber      RV    eRV

ここで、line1 =

001  _P10644  0.816  123.04  2450.3    74.2   15.34     001  F1_P10644       P     1  4.89977691  -0.5104696   15.3  F1_P10644    4.899776910023531   -0.510469633262908   15.34   100606F1red    001  122.47   2.94 

およびline2=

002   Parked  -99.9   -99.9   -99.9   -99.9   -99.9     002  Parked          N     2  4.88965087  -0.4904939    0.0  -99.9        -99.9               -99.9                -99.9         -99.9  -99.9   -99.9  -99.9

そのため、3番目のファイルに一致しない行に-99.9が書き込まれました。

これで、ヘッダーをスキップしてファイルを結合できます。

join -1 1 -2 1 |awk 'NR != 1' <T1_02 |awk 'NR != 1'<T1_01 >T1_021

join -1 1 -2 6 T1_021 |awk 'NR != 1'<T1_03 >T1_0123

ただし、これは結合にリストされている最初のテーブルの結果のみを出力するため、必要なすべての列を取得することはできません。同様に、3つのテーブルすべてが必要な場合は、次のことができます。

paste T1_01 T1_02 T1_03

ただし、この場合、T1_03いくつかの値が欠落しているため、myは一致しません。だから私が探しているのは、次のようなことを言う方法です。

for all i in files T1_01,T1_02,T1_03
  if T1_01 $1 == T1_02 $2 == T1_03 $6 
    # then print T1_01[i] T1_02[i] T1_03[i] \n, 
  else 
    # print T1_01[i] T1_02[i] -99.9 (for all blanks)
  fi
done

または、逆に、上記の結合ステートメントを使用して、結合された両方のテーブルのすべての行を出力するか、ある種の貼り付けを行います。加入??私はまだ実際に機能するものを見つけていないので、その最後のアイデアについてはよくわかりません。

さらに、後で-99.9を追加することもできます。

sed -i -e 's/                        / 99.9 -99.9 -99.9 -99.9 -99.9 -99.9 -99.9 -99.9/' T1_0123

また、ヘッダーを手動で追加することもできるため、主な問題は正しい貼り付け結果を取得することです。

今回は、新しいbashユーザーを支援してくれた皆さんに感謝します。

4

1 に答える 1

2

これはあなたが望むことをしています。このスクリプトは、データがdata1、data2、およびdata3にあることを前提としています。起点に従ってタグを付けながら、このすべてのデータを一時ファイルに書き込みます(data1の行には「A」などが追加されます)。また、data3の行頭に結合するインデックスを追加します。次に、データは対応する行をグループ化するために並べ替えられます。
次に、awkを使用して、対応するレコードを印刷し、data3から欠落しているエントリのプレースホルダーデータを入力します。

それがあなたが望んでいたものではない場合、あなたはあなたのニーズに適応することができるはずです-そうでなければコメントをドロップしてください:-)

#!/bin/bash

awk 'NR > 1 {print $0, "A"}' data1 >tmp
awk 'NR > 1 {print $0, "B"}' data2 >>tmp
awk '{print $6, $0, "C"}' data3 >>tmp

sort -nk1,1 tmp | \
  awk '
    function printDATA() {
        print DATA["A"], DATA["B"], DATA["C"]
        DATA["C"] = "-99.9 -99.9 -99.9 -99.9 -99.9"
        DATA["C"] = DATA["C"] " -99.9 -99.9 -99.9"
    }
    $1 != last && NR > 1{printDATA()}
    {
        m = $NF; $NF = ""; last = $1;
        if(m == "C") {$1 = ""}
        DATA[m] = $0
    }
    END {printDATA()}
  '
于 2012-08-21T06:25:33.947 に答える