2016-04-29 3 views
0

В оболочке bash у меня есть переменная, которая печатает набор имен. Теперь я хотел бы добавить расширение к нему. У меня есть файлы последовательности со следующими именами:Передача переменных в другие программы

Meoh_R1.fastq 
Meoh_R2.fastq 
R3G_R1.fastq 
R3G_R2.fastq 

У меня есть общие имена (Meoh и R3G в переменной). В Баш я запускаю следующий сценарий без каких-либо проблем:

# Stores common names in variable `i` (meoh and r3g) 
for i in $(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
do 
    # Make direcotry for fastqc 
    mkdir -p ${i%}_fastqc 
    # Run fastqc 
    fastqc -o ./${i%}_fastqc -f fastq ./rnaseq/${i%}_R1.fastq ./rnaseq/${i%}_R2.fastq 
done 

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

filelist=$(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
mkdir -p ${i%}_fastqc 
fastqc -o ./${filelist%}_fastqc -f fastq ./rnaseq/${filelist%}_R1.fastq ./rnaseq/${filelist%}_R2.fastq 

Приведенный выше код не создает отдельные папки, как рабочий код, предоставленный выше.

+0

Почему вы пишете '$ {i%}' вместо '$ {i}'? Модификатор '%' ничего не делает, если после него ничего не поместить. – Barmar

+0

Вы не можете поместить всю переменную списка файлов в одну командную строку. Он не будет автоматически разделять его и повторять команду для каждого элемента. Вам нужно использовать петлю, как и вы. – Barmar

ответ

1

Вот способ обойтись без цикла:

filelist=$(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
echo "$filelist" | sed 's/.*/&_fastqc/' | xargs mkdir -p 
echo "$filelist" | xargs -I{} fastqc -o ./{}_fastqc -f fastq ./rnaseq/{}_R1.fastq ./rnaseq/{}_R2.fastq 

Это будет иметь тот же эффект, что и петли, однако, работает fastqc один раз на каждом входном файле.

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