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(加入第 1T1_01T1_02、第 1 列和第 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

其中第 1 行 =

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 

和线2 =

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 被写入与第三个文件不匹配的行中。

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

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

或者相反,使用我上面的 join 语句并打印两个表中的所有行加入,或者可能是某种粘贴 | 加入??不确定最后一个想法,因为我还没有找到任何真正有效的方法。

此外,我可以稍后将 -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 回答