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