Ну,
$ (...)
, а не $ {...}
. Обычные скобки, а не фигурные. $ index
в одинарных кавычках, поэтому оболочка не раскрывает его , а не . Для этого вам нужны двойные кавычки. $ data
в двойные кавычки в эхо, это имеет значение, если data
содержит пробельные символы или символы глобуса data = $ {data: $ index}
для удаления ряда символов с начала строки. Рекомендуемая литература: http://mywiki.wooledge.org/BashGuide
. Вы можете использовать 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
На самом деле вы на правильном пути. Однако вам необходимо использовать поле десять в качестве индекса для вашей структуры данных:
awk '{data[$10] = $14} END { for (d in data) print d " " data[d]; }'
Если вам нужно различать несколько полей, используйте что-то вроде
data[$10, "14"] = "x"; data[$10, "11"] = "y"
использование в качестве файла 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, ":")
разделит 10-е поле в массиве A в соответствии с ":" B [A [1]] = $ 14;
довольно просто файл программы вызывается с использованием
awk -f se.awk data