awk для объединения большого табличного файла?

Ну,

  1. Подстановка команды - это $ (...) , а не $ {...} . Обычные скобки, а не фигурные.
  2. У вас есть $ index в одинарных кавычках, поэтому оболочка не раскрывает его , а не . Для этого вам нужны двойные кавычки.
  3. Заключите $ data в двойные кавычки в эхо, это имеет значение, если data содержит пробельные символы или символы глобуса
  4. В bash вы можете просто использовать расширение подстроки data = $ {data: $ index} для удаления ряда символов с начала строки.

Рекомендуемая литература: http://mywiki.wooledge.org/BashGuide

1
05.07.2016, 11:04
3 ответа

. Вы можете использовать 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
1
27.01.2020, 23:47

На самом деле вы на правильном пути. Однако вам необходимо использовать поле десять в качестве индекса для вашей структуры данных:

awk '{data[$10] = $14} END { for (d in data) print d " " data[d]; }'

Если вам нужно различать несколько полей, используйте что-то вроде

data[$10, "14"] = "x"; data[$10, "11"] = "y"
0
27.01.2020, 23:47

использование в качестве файла 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
0
27.01.2020, 23:47

Теги

Похожие вопросы