我有两个文件如下,我想根据公共ID将它们合并到一个文件中:
File1中:
ARS 8.0 8.0
BBL 1.1 1.2
CCL 1.9 1.8
文件2:
ARS 2.3 2.4
ARS 2.6 2.4
ARS 2.5 2.3
BBL 1.9 1.8
EDE 1.4 1.6
期望的输出:
ARS 8.0 8.0 ARS 2.3 2.4
ARS 8.0 8.0 ARS 2.6 2.4
ARS 8.0 8.0 ARS 2.5 2.3
BBL 1.1 1.2 BBL 1.9 1.8
CCL 1.9 1.8 NA
NA EDE 1.4 1.6
答案 0 :(得分:2)
.material-list-item {
float: left;
}
$ cat tst.awk
BEGIN { FS=OFS="\t" }
FNR==1 {
na = $0
gsub("[^"FS"]","",na)
nas[++numFiles] = "NA" na
}
NR==FNR { file1[$1] = $0; next }
$1 in file1 { print file1[$1], $0 }
{ file2[$1] = $0 }
END {
for (key in file1) {
if ( !(key in file2) ) {
print file1[key], nas[2]
}
}
for (key in file2) {
if ( !(key in file1) ) {
print nas[1], file2[key]
}
}
}
可以通过各种方式对其进行优化,以便不将两个文件的全部内容存储在数组中,但我喜欢上述的简单性和对称性,如果事实证明是以后优化则很简单由于大量输入文件所必需的。
答案 1 :(得分:1)
请你试着跟我来,让我知道这是否对你有所帮助。(我最后保留了NA的顺序只让我知道这是否对你有所帮助)。 此处也添加非单一衬里形式的解决方案。
awk '
FNR==NR{
a[$1]=$0;
next
}
($1 in a){
print a[$1],$0;
b[$1];
next
}
{
print "NA\t",$0
}
END{
for(i in b){
delete a[i]
};
for(j in a){
print a[j],"\tNA"
}
}
' file1 file2
输出如下。
ARS 8.0 8.0 ARS 2.3 2.4
ARS 8.0 8.0 ARS 2.6 2.4
ARS 8.0 8.0 ARS 2.5 2.3
BBL 1.1 1.2 BBL 1.9 1.8
NA EDE 1.4 1.6
CCL 1.9 1.8 NA
答案 2 :(得分:1)
有一个合并文件的工具
join -a 1 -a 2 -e NA t24.in1 t24.in2 -o 1.1,1.2,1.3,2.1,2.2,2.3
输出:
ARS 8.0 8.0 ARS 2.3 2.4
ARS 8.0 8.0 ARS 2.6 2.4
ARS 8.0 8.0 ARS 2.5 2.3
BBL 1.1 1.2 BBL 1.9 1.8
CCL 1.9 1.8 NA NA NA
NA NA NA EDE 1.4 1.6