Я работаю над улучшением рабочего процесса 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)