awk 合并大型表格文件?

awk 合并大型表格文件?

我有一个文件,其中列中有 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_11old_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

相关内容