组合多个文件的列,同时根据不同的列匹配顺序并为缺失值添加0
Combining columns of multiple files while matching the order based on a different column and adding 0 for missing values
我有多个文件想以一种奇怪的方式合并。
假设这是我的文件之一:
1 group1
5 group5
6 group9
10 group3
2 group10
这是另一个文件:
0.1 group3
3 group5
52 group2
11 group4
8 group10
我想将这些文件合并到一个新文件中,以便我得到:
File1 File2
group1 1 0
group2 0 52
group3 10 0.1
group4 0 11
group5 5 3
group9 6 0
group10 2 8
所以:
- 根据另一列中的注释组合一列中的值。
- 如果文件缺少给定注释的值,它会得到“0”。
- 文件名变为 header,"annotations" 变为新文件中的行名。
有没有办法使用 bash 脚本(或其他一些方便的方法)来做到这一点?我有几千个这样的文件,所以手动完成它真的不是一个选择...
非常感谢!
编辑:我想我可以按照以下步骤操作:
1)我有一个所有可能注释的列表。对于每个文件(遍历每个文件),我可以检查注释是否存在,如果不存在,我可以在文件中插入一个新行:
0 annotation
2) 我可以按字母顺序对每个文件进行排序
3) 然后我可以将它们全部合并到一个文件中(并以某种方式在这里找出 header 的东西)
有人对这些步骤有任何想法吗?
这是一种方法:
awk 'FNR==1 { ++n }
{ a[,n]=;b[] }
END {
for (c in b) {
for (i=1;i<=n;i++)
$i=((c,i) in a?a[c,i]:0)
=(c OFS )
print
}
}' file1 file2 file3 ...
将命令行中的第二个字段加上文件的索引与数组中的第一个字段进行哈希运算,并在另一个数组中保留唯一注释作为参考,以便我们可以循环遍历第一个数组。
我有多个文件想以一种奇怪的方式合并。
假设这是我的文件之一:
1 group1
5 group5
6 group9
10 group3
2 group10
这是另一个文件:
0.1 group3
3 group5
52 group2
11 group4
8 group10
我想将这些文件合并到一个新文件中,以便我得到:
File1 File2
group1 1 0
group2 0 52
group3 10 0.1
group4 0 11
group5 5 3
group9 6 0
group10 2 8
所以:
- 根据另一列中的注释组合一列中的值。
- 如果文件缺少给定注释的值,它会得到“0”。
- 文件名变为 header,"annotations" 变为新文件中的行名。
有没有办法使用 bash 脚本(或其他一些方便的方法)来做到这一点?我有几千个这样的文件,所以手动完成它真的不是一个选择...
非常感谢!
编辑:我想我可以按照以下步骤操作:
1)我有一个所有可能注释的列表。对于每个文件(遍历每个文件),我可以检查注释是否存在,如果不存在,我可以在文件中插入一个新行:
0 annotation
2) 我可以按字母顺序对每个文件进行排序 3) 然后我可以将它们全部合并到一个文件中(并以某种方式在这里找出 header 的东西)
有人对这些步骤有任何想法吗?
这是一种方法:
awk 'FNR==1 { ++n }
{ a[,n]=;b[] }
END {
for (c in b) {
for (i=1;i<=n;i++)
$i=((c,i) in a?a[c,i]:0)
=(c OFS )
print
}
}' file1 file2 file3 ...
将命令行中的第二个字段加上文件的索引与数组中的第一个字段进行哈希运算,并在另一个数组中保留唯一注释作为参考,以便我们可以循环遍历第一个数组。