Использование GNU datamash
,split
(GNU coreutils )иawk
:
#!/bin/bash
# remove header line and split `input_file` into n files `split00000`, `split00001`...
# with max. 4 lines each (use `-l50` for your data file)
split -d -a5 -l4 <(tail -n+2 input_file) split
{ head -n1 input_file # add header
for fsplit in split*; do
mean=$(datamash -W mean 7 < "$fsplit") # calculate mean value
awk -v mean="$mean" '{ print $1,$2,$3,$4,$5,$6,mean,$8,$9 }' "$fsplit"
done
} | column -t > output_file # format as table and write result
rm split* # cleanup
В этом скрипте я использовал ваши данные (удалены пунктирные линии )в качестве входных данных и только 4 значения для среднего значения.
Замените -l4
на -l50
для вашего файла данных в сценарии. Это почти то же самое, что и вы, я просто позволяю split
и datamash
делать всю работу.
Входной файл:
$ cat input_file
trait effect snp chr pos snp_effect weight variance_explained var_a_hat
1 2 1 1 54 0.2030156E-02 1.251482 0 0
1 2 2 1 689 -0.3726744E-03 0.9660012 0 0
1 2 3 1 1234 0.4801369E-03 0.9823542 0 0
1 2 4 1 1280 -0.1104844E-03 0.9272357 0 0
1 2 5 1 2610 -0.1296295E-02 1.115933 0 0
1 2 481971 26 4897157 -0.7846317E-04 0.9226092 0 0
1 2 481972 26 4898314 -0.3934468E-03 0.9691408 0 0
1 2 481973 26 4898376 -0.7204678E-03 1.019935 0 0
1 2 481974 26 4898606 -0.1522481E-03 0.9333048 0 0
Результат:
$ cat output_file
trait effect snp chr pos snp_effect weight variance_explained var_a_hat
1 2 1 1 54 0.2030156E-02 1.031768275 0 0
1 2 2 1 689 -0.3726744E-03 1.031768275 0 0
1 2 3 1 1234 0.4801369E-03 1.031768275 0 0
1 2 4 1 1280 -0.1104844E-03 1.031768275 0 0
1 2 5 1 2610 -0.1296295E-02 1.0069045 0 0
1 2 481971 26 4897157 -0.7846317E-04 1.0069045 0 0
1 2 481972 26 4898314 -0.3934468E-03 1.0069045 0 0
1 2 481973 26 4898376 -0.7204678E-03 1.0069045 0 0
1 2 481974 26 4898606 -0.1522481E-03 0.9333048 0 0