使用 bash 合并每列中具有相同名称的行
Combine rows with the same name in each column using bash
我有一个如下所示的文件(但有 52 列和 4,000 行):
1NA2 1NB2 2RA2 2RB2
Vibrionaceae 0.22 0.25 0.36 1.02
Bacillaceae 2.0 1.76 0.55 0.23
Enterobacteriaceae 0.55 0.52 2.40 1.23
Vibrionaceae 0.22 0.25 0.36 1.02
Bacillaceae 2.0 1.76 0.55 0.23
Enterobacteriaceae 0.55 0.52 2.40 1.23
我希望它看起来像这样:
1NA2 1NB2 2RA2 2RB2
Vibrionaceae 0.44 0.50 0.72 2.04
Bacillaceae 4.0 3.52 1.10 0.46
Enterobacteriaceae 1.10 1.04 4.80 2.46
编辑:对不起,我不想删除剩余的行和列。每行名称重复多次,所以我希望它只出现 1 次,每列中的总数。
我尝试了以下方法:
awk '{a[]+=}END{for(i in a) print i,a[i]}' file
但它只对第一列有效,我希望它适用于所有 52 列。
使用 GNU awk 和二维数组:
awk 'NR==1
NR>1{
for(i=2; i<=NF; i++){
a[][i]+=$i
}
}
END{
for(i in a){
printf("%-19s", i)
for(j=2; j<=NF; j++){
printf("%.2f ", a[i][j])
}
print ""
}
}' file
或单行:
awk 'NR==1; NR>1{for(i=2; i<=NF; i++){a[][i]+=$i}} END{for(i in a){printf("%-19s", i); for(j in a[i]){printf("%.2f ", a[i][j])} print ""}}' file
输出:
1NA2 1NB2 2RA2 2RB2
Bacillaceae 4.00 3.52 1.10 0.46
Vibrionaceae 0.44 0.50 0.72 2.04
Enterobacteriaceae 1.10 1.04 4.80 2.46
NR
is the line number
NF
is the number of fields in a row
我有一个如下所示的文件(但有 52 列和 4,000 行):
1NA2 1NB2 2RA2 2RB2
Vibrionaceae 0.22 0.25 0.36 1.02
Bacillaceae 2.0 1.76 0.55 0.23
Enterobacteriaceae 0.55 0.52 2.40 1.23
Vibrionaceae 0.22 0.25 0.36 1.02
Bacillaceae 2.0 1.76 0.55 0.23
Enterobacteriaceae 0.55 0.52 2.40 1.23
我希望它看起来像这样:
1NA2 1NB2 2RA2 2RB2
Vibrionaceae 0.44 0.50 0.72 2.04
Bacillaceae 4.0 3.52 1.10 0.46
Enterobacteriaceae 1.10 1.04 4.80 2.46
编辑:对不起,我不想删除剩余的行和列。每行名称重复多次,所以我希望它只出现 1 次,每列中的总数。 我尝试了以下方法:
awk '{a[]+=}END{for(i in a) print i,a[i]}' file
但它只对第一列有效,我希望它适用于所有 52 列。
使用 GNU awk 和二维数组:
awk 'NR==1
NR>1{
for(i=2; i<=NF; i++){
a[][i]+=$i
}
}
END{
for(i in a){
printf("%-19s", i)
for(j=2; j<=NF; j++){
printf("%.2f ", a[i][j])
}
print ""
}
}' file
或单行:
awk 'NR==1; NR>1{for(i=2; i<=NF; i++){a[][i]+=$i}} END{for(i in a){printf("%-19s", i); for(j in a[i]){printf("%.2f ", a[i][j])} print ""}}' file
输出:
1NA2 1NB2 2RA2 2RB2 Bacillaceae 4.00 3.52 1.10 0.46 Vibrionaceae 0.44 0.50 0.72 2.04 Enterobacteriaceae 1.10 1.04 4.80 2.46
NR
is the line number
NF
is the number of fields in a row