
列には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の2つの部分を配列(ここでは呼ばれますarr10
)として抽出できます。
split($10, arr10, ":")
その後、配列の最初の要素と要素全体14の組み合わせに基づいてインデックスを作成できます。そのインデックスを使用すると、次のsum_of_11
2つの新しい配列を作成できます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
実際、あなたは正しい道を行っています。ただし、データ構造へのインデックスとしてフィールド10を使用する必要があります。
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