2016-10-13 2 views
0

У меня есть текстовый файл, содержащий переменные, как это:Читать переменные из файла и перебрать их в Баш

lane1_pair1="file1" 
lane1_pair2="file2" 
lane2_pair1="file3" 
lane2_pair2="file4" 
... 

я хотел бы цикл через переменные и конкатенировать их все в одном файле. Я подаю петлю как:

. variables 
for ((n=1; n<=no_lanes; n++)) { 

     cat $"lane"${n}_pair1 >> "$sampleID"_cat1.fq 
     cat $"lane"${n}_pair2 >> "$sampleID"_cat2.fq 
} 

"$sampleID"_cat1.fq > fq_align_1 
"$sampleID"_cat2.fq > fq_align_2 

Проблема здесь в том, что, команда кот не работает, потому что вместо того, чтобы заменить "laneX_pairY" с его значением, рассматривать его как строку. Мне было интересно, есть ли здесь кто-нибудь здесь.

+0

Я не уверен в нескольких элементах этого: где определены переменные 'no_lanes',' lane' и 'sampleID'? Каковы две нижние линии, которые нужно выполнить? Что вы хотите, чтобы окончательный вывод файла выглядел? – spinup

+0

Последние две строки в основном помещают конкатенированное содержимое в fq_align, которое будет передано следующему аргументу. –

+0

Итак, в этих строках вы пытаетесь прочитать из файла и поместить результат в переменную, верно? – spinup

ответ

0

Как я вижу, проблема в том, что вы перебираете переменные, которые называются массивом, но не являются такими. Затем вы можете попытаться оценить содержимое имени переменной, созданного из вашей другой переменной индексации, которая является рецептом беспорядочного кода, который легко ломается. Я рекомендую делать фактические массивы имен файлов из вашего variables файла:

p1_files=($(grep 'pair1' variables | cut -d '=' -f 2)) 
p2_files=($(grep 'pair2' variables | cut -d '=' -f 2)) 

for f in "${p1_files[@]}"; do 
    cat "${f//\"/}" >> "$sampleID"_cat1.fq 
done 

for f in "${p2_files[@]}"; do 
    cat "${f//\"/}" >> "$sampleID"_cat2.fq 
done 

Я не знаю, как вы хотите, чтобы ваши fq_align_n переменных быть, но вы можете прочитать содержимое файла переменных с помощью:

fq_align_1=$(cat "$sampleID"_cat1.fq) 
fq_align_2=$(cat "$sampleID"_cat2.fq) 

Или просто пропустите создание файла в целом и поэтапно создайте переменные в циклах.

Смежные вопросы