рабочий процесс bash / awk, работающий с файлами с несколькими столбцами

Я работаю над улучшением рабочего процесса bash-awk, предназначенного для анализа данных в формате нескольких столбцов. Скрипт использует код AWK (который извлекает числа из выбранных столбцов input.csv, а также выполняет некоторые базовые вычисления статистики), интегрированный в скрипт bash (который работает с входными файлами, расположенными в разных папках):

#!/bin/bash
home="$PWD"
# folder with the outputs
rescore="${home}"/rescore 
# folder with the folders to analyse
storage="${home}"/results
csv_pattern='*_filt.csv'
str_name="output.csv"


while read -r d; do
#awk -F, '                       # set field separator to comma
awk -F ", *" '                  # set field separator to comma, followed by 0 or more whitespaces
FNR==1 {
   if (n) {                     # calculate the results of previous file     
      lowest[suffix] = min      # lowest dG
      highest[suffix] = fourth  # dG in cluster with highest pop
   }
   prefix=suffix=FILENAME
   sub(/_.*/, "", prefix)
   sub(//[^/]+$/, "", suffix)
   sub(/^.*_/, "", suffix)
   s = 0                        # sum of $3
   s2 = 0                       # sum of $3 ** 2
   n = 0                        # count of samples
   min = 0                      # lowest value of $3 (assuming all $3 < 0)
   max = 0                      # highest value of $2 (assuming all $2 > 0)
}
FNR > 1 {
   s += $3
   s2 += $3 * $3
   ++n
   if ($3 < min) min = $3       # update the lowest value
   if ($2 > max) {
      max = $2                  # update popMAX
      fourth = $3               # update the value of dG corresponded to topPOP
   }
}
END {
  if (n) {                     # just to avoid division by zero
   lowest[suffix] = min     # most negative dG
   highest[suffix] = fourth  # dG in a cluster with pop(MAX)
  }
   print "Lig(CNE)", "dG(min)", "dG(popMAX)"
   for (i in mean)
      printf "%s %.2f %.2fn", i, lowest[i],  highest[i]
}'  "${d}_"*/${str} > "${rescore}/"${str_name}"/"${d%%_*}".csv"
done < <(find . -maxdepth 1 -type d -name '*_*_*' | awk -F '[_/]' '!seen[$2]++ {print $2}')

По сути, скрипт работает с input.csv (показан ниже), извлекая числа из третьего столбца (dG): i) обнаруживая минимальное значение в третьем столбце (dG (min), которое всегда соответствует строке с ID = 1) , а также номер dG соответствовал максимальному номеру во втором столбце (POPmax):

# input *_filt.csv located in the folder 10V1_cne_lig12
ID, POP, dG
1, 142, -5.6500 # this is dG min to be extracted
2, 10, -5.5000
3, 2, -4.9500
4, 150, -4.1200 # this is dG corresponded to pop(MAX) to be extracted

наконец, он сохраняет результаты в другом многоколоночном выходном файле, содержащем часть имени каждого обработанного CSV (с соответствующим префиксом, используемым в качестве идентификатора строки), а также информацию о его dG (min) и dG (popMAX ). Для 5 обработанных input.csvs будет насчитываться 5 строк и 3 столбца с именем исходного файла, dG (min), а также dG (соответствует popMAX):

# output.csv
Lig(CNE)    dG(min) dG(popMAX)
lig12       -5.65   -4.12      # this line from the input.csv shown above !
lig40       -5.52   -5.52
lig199      -4.81   -4.81
lig211      -5.28   -5.28
lig278      -5.76   -5.76

Мне нужно изменить AWK-часть моего скрипта, чтобы добавить два дополнительных столбца в output.csv содержал информацию о POP (номер из второго столбца inout.csv) для каждого из соответствующих значений dG (было взято из 3-го столбца того же журнала). Так что тот же журнал должен быть таким

# output.csv
Lig(CNE).   dG(min) POP(min)    dG(popMAX) POP(max)
lig12       -5.65   (142)       -4.12      (150) # this is both dG and POP from input.csv
lig40       -5.52   (30)         -5.52     (34)
lig199      -4.81   (111)        -4.81    (300)
lig211      -5.28   (4)          -5.28      (12)
lig278      -5.76   (132)        -5.76    (150)

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *