Как прочитать два файла в bash, чтобы создать список вложенных выходных данных для распараллеливания команды - PullRequest
0 голосов
/ 24 апреля 2020

Я использовал bash для создания списка команд анализа, например так:

while read sample control; do echo analysis --target $sample --control $control --output /path/to/results/$sample/'$sample'_output.txt >> /path/to/commands/commands.txt ; done < sample_list.txt

Входной файл sample_list.txt выглядит следующим образом

sample_A control_A
sample_B control_B

Однако я хочу чтобы сделать что-то более сложное, где для каждой из этих команд я запускаю ее для подмножества данных, чтобы распараллелить анализ, чтобы он выполнялся быстрее. Я могу сделать это, добавив опцию '--interval-list' и предоставив подмножество общих данных для анализа. Но я не знаю, кому это сделать вместе со списком образцов эффективным способом.

Команда завершения, которую я представляю, будет выглядеть примерно так:

while read sample control regions; do echo analysis --target $sample --control $control --interval-list $regions --output /path/to/results/$sample/'$sample'_'$regions'_output.txt >> /path/to/commands/commands.txt ; done < sample_list.txt

Например, для первых двух наборов сэмплов, я бы хотел теперь иметь 20 выводимых команд вместо 2. С эти переменные:

sample_A control_A Region_1
sample_A control_A Region_2
sample_A control_A Region_3
sample_A control_A Region_4
sample_A control_A Region_5
sample_A control_A Region_6
sample_A control_A Region_7
sample_A control_A Region_8
sample_A control_A Region_9
sample_A control_A Region_10
sample_B control_B Region_1
sample_B control_B Region_2
sample_B control_B Region_3
sample_B control_B Region_4
sample_B control_B Region_5
sample_B control_B Region_6
sample_B control_B Region_7
sample_B control_B Region_8
sample_B control_B Region_9
sample_B control_B Region_10

, и пример выходной строки будет выглядеть следующим образом:

analysis --target sample_A --control control_A --interval-list Region_1 --output /path/to/results/sample_A/sample_A_Region_1_output.txt 

Я мог бы просто поместить строки выше в файл sample_list.txt, но такой тип побеждает точку эффективная л oop. Я думаю, что мне нужен файл sample_list.txt и отдельный файл region.txt в качестве входных данных для переменной --interval-list, поэтому он может l oop через 10 областей для каждой строки в файле sample_list.txt, если это делает смысл. Вроде как al oop в al oop.

Но я не знаю, как вписать в него файл region.txt так, чтобы это было проще, чем выписывать все комбинации вручную.

Входные данные для файла регионов.txt будут выглядеть следующим образом:

Region_1
Region_2
Region_3
Region_4
Region_5
Region_6
Region_7
Region_8
Region_9
Region_10

Большое спасибо за любые предложения.

1 Ответ

1 голос
/ 24 апреля 2020

Вы можете прочитать регионы в массив и l oop по регионам во внутреннем l oop:

#!/bin/bash

# read regions into an array
mapfile -t regions < regions.txt

while read sample control; do
  for region in "${regions[@]}"; do # loop over regions
    echo "analysis --target $sample --control $control --output /path/to/results/$sample/${sample}_${region}_output.txt"
  done
done < sample_list.txt > /path/to/commands/commands.txt # write output to commands.txt
...