我有一个文件,其中列中有 21 个表格字段。选项卡14和15是针对选项卡10中的变量重复多次的数据集(直到“:”),并且选项卡11具有选项卡10的数字描述数据。
这是输入的示例:
399 3 0 0 0 0 0 0 - chromosome_1_Contig0.1980:10701-11103 402 0 402 gi|952977790|ref|NM_001317128.1| 849 447 849 1 402 0 447
281 0 0 0 0 0 0 0 - chromosome_1_Contig0.1980:11209-11490 281 0 281 gi|952977790|ref|NM_001317128.1| 849 166 447 1 281 0 166
166 0 0 0 0 0 0 0 - chromosome_1_Contig0.1980:11588-11754 166 0 166 gi|952977790|ref|NM_001317128.1| 849 0 166 1 166 0 0
51 0 0 0 0 0 0 0 + chromosome_1_Contig0.3916:1547-1598 51 0 51 gi|733214878|ref|NM_001303082.1| 708 0 51 1 51 0 0
132 0 0 0 0 0 0 0 + chromosome_1_Contig0.3916:3201-3333 132 0 132 gi|733214878|ref|NM_001303082.1| 708 282 414 1 132 0 282
294 0 0 0 0 0 0 0 + chromosome_1_Contig0.3916:3412-3706 294 0 294 gi|733214878|ref|NM_001303082.1| 708 414 708 1 294 0 414
103 4 0 0 0 0 0 0 + chromosome_1_unplaced_Contig0.3951:379-486 107 0 107 gi|526117967|ref|NM_001281232.1| 1518 1236 1343 1 107 0 1236
212 1 0 0 0 0 0 0 - chromosome_1_unplaced_Contig0.12366:214-427 213 0 213 gi|526117831|ref|NM_001281196.1| 1025 738 951 1 213 0 738
178 2 0 0 0 0 0 0 - chromosome_1_unplaced_Contig0.12366:633-813 180 0 180 gi|526117831|ref|NM_001281196.1| 1025 558 738 1 180 0 558
243 1 0 0 0 0 0 0 - chromosome_1_unplaced_Contig0.12366:909-1153 244 0 244 gi|526117831|ref|NM_001281196.1| 1025 314 558 1 244 0 314
313 1 0 0 0 0 0 0 - chromosome_1_unplaced_Contig0.12504:1668-1887 314 0 314 gi|526117831|ref|NM_001281196.1| 1025 0 314 1 314 0 0
我想从中获得一个新的汇总表格文件,其中;
对于新行中选项卡 10 到“:”和选项卡 14 中的值相同的行,将针对该组合对选项卡 11 进行求和。我想保留这些组合仅出现一次的行。这给了我 3 个新的汇总选项卡。然后我想包含之前的选项卡 15 以及新选项卡中新选项卡 3 和旧选项卡 15 之间的差异。输出应如下所示:
示例输出:
old_tab_10 old_tab_14 sumof_old_tab11 old_tab15 (old_tab15)-(sumof_old_tab11)
chromosome_1_Contig0.1980 gi|952977790|ref|NM_001317128.1| 849 849 0
chromosome_1_Contig0.3916 gi|733214878|ref|NM_001303082.1| 477 708 231
chromosome_1_unplaced_Contig0.3951 gi|526117967|ref|NM_001281232.1| 107 1518 1411
chromosome_1_unplaced_Contig0.12366 gi|526117831|ref|NM_001281196.1| 637 1025 388
chromosome_1_unplaced_Contig0.12504 gi|526117831|ref|NM_001281196.1| 314 1025 711
我开始摆弄一些类似的东西
awk '{S[$14]+=$11;N[$14]+} END{for(i in S){print i, N[i]}}'
然后意识到这超出了我的能力范围,我什至不确定如何分隔选项卡和“:”的字段,如果这是一个好主意,或者是否最好使用不同的方法来分隔“:” ”。
答案1
您可以使用split
将字段 10 的两部分提取到一个数组(此处称为arr10
)中,如下所示:
split($10, arr10, ":")
然后,您可以根据该数组的第一个元素和整个元素 14 的组合构建一个索引。使用该索引,您可以构建两个新数组,例如sum_of_11
和old_15
:
sum_of_11[arr10[1]"\t"$14] += $11 # sum of all rows that have this index
old_15[arr10[1]"\t"$14] = $15 # just the value in the single most recent row
将其放在一起(并设置OFS = "\t"
):
awk '{ split($10, arr10, ":");
sum_of_11[arr10[1]"\t"$14] += $11;
old_15[arr10[1]"\t"$14] = $15
} END {
OFS = "\t";
for (i in sum_of_11) {
print i, sum_of_11[i], old_15[i], old_15[i] - sum_of_11[i]
}
}' file
结果:
chromosome_1_Contig0.3916 gi|733214878|ref|NM_001303082.1| 477 708 231
chromosome_1_unplaced_Contig0.12366 gi|526117831|ref|NM_001281196.1| 637 1025 388
chromosome_1_unplaced_Contig0.3951 gi|526117967|ref|NM_001281232.1| 107 1518 1411
chromosome_1_unplaced_Contig0.12504 gi|526117831|ref|NM_001281196.1| 314 1025 711
chromosome_1_Contig0.1980 gi|952977790|ref|NM_001317128.1| 849 849 0
答案2
事实上,你走在正确的轨道上。但是,您需要使用字段十作为数据结构的索引:
awk '{data[$10] = $14} END { for (d in data) print d " " data[d]; }'
如果您需要区分多个字段,请使用类似
data[$10, "14"] = "x"; data[$10, "11"] = "y"
答案3
用作 awk 文件
{ split($10,A,":") ;
B[A[1]]=$14 ; C[A[1]] += $11 }
END { for ( a in B ) printf "%s\t%s\t%d\n",a,B[a],C[a] ;}
给出
chromosome_1_unplaced_Contig0.12366 gi|526117831|ref|NM_001281196.1| 637
chromosome_1_unplaced_Contig0.12504 gi|526117831|ref|NM_001281196.1| 314
chromosome_1_unplaced_Contig0.3951 gi|526117967|ref|NM_001281232.1| 107
chromosome_1_Contig0.1980 gi|952977790|ref|NM_001317128.1| 849
chromosome_1_Contig0.3916 gi|733214878|ref|NM_001303082.1| 477
我不明白其他要求。然而
split($10,A,":")
将根据“:”拆分数组 A 中的第 10 个字段B[A[1]]=$14 ;
非常简单
程序文件被调用使用
awk -f se.awk data