第二次尝试使用AWK / SED /加入3个表

时间:2012-08-21 03:48:48

标签: sed awk paste

所以,我的上一个问题我还不够具体,虽然我距离很近,但我仍然有问题以一种有意义的方式加入我的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

因此-99.9被写入与第3个文件不匹配的行。

现在我可以加入文件,如果我跳过标题:

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将不匹配,因为它缺少多个值。所以我要找的是一种说法的方式:

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用户!

1 个答案:

答案 0 :(得分:2)

这就是你想要的。该脚本假定您的数据位于data1,data2和data3中。它将所有这些数据写入临时文件,同时根据原点标记它(来自data1的行附加“A”等等)。它还添加了从data3连接到行开头的索引。然后将数据分类到相应的行组 然后awk用于打印相应的记录,并填写数据3中缺少的条目的占位符数据。

如果这不是你想要的,你应该能够适应你的需要 - 否则就发表评论: - )

#!/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()}
  '