Используя цикл for, запустите сценарий для всех файлов в каталоге

Awk создает неявный цикл вокруг основной части скрипта: за исключением блоков BEGIN и END (и определений функций), скрипт выполняется для каждой строки в последовательности.Поэтому было бы очень странно иметь в awk-скрипте цикл типа for (i = 1; i<= NR; i++): когда awk проходит первую строку, выполняется тело цикла для i=1, затем awk проходит вторую строку и тело цикла выполняется для i=1 и i=2, затем awk проходит вторую строку и тело цикла выполняется для i=1 и i=2 и i=3 и т. д.

Предполагая, что имена сотрудников не повторяются, общая заработная плата каждого работника равна просто $2 * $3. Вы можете распечатать это, если хотите:

NR == 1 { print $1, $2, $3, "total" }
NR != 1 { print $1, $2, $3, $2 * $3 }

(Условие NR == 1 идентифицирует строку заголовка.)

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

NR != 1 { total += $2 * $3 }
1
25.08.2016, 01:04
2 ответа

Ваш сценарий не использует переменную цикла filename . filename.fastqsanger не ссылается на переменную и подразумевает, что полное имя файла еще не присутствует, хотя оно есть.

Вот исправленная версия:

for filename in /Test/*.fastqsanger; do
    awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < $filename | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p'  | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > $filename.fasta
done
1
28.01.2020, 01:12

Вы не используете переменную filename в строке ниже:

for filename in /Test/*.fastqsanger; do
    awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < filename.fastqsanger | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p'  | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > filename.fasta
done

Попробуйте:

for filename in /Test/*.fastqsanger
do
    fname=`basename $filename .fastqsanger`
    awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < $filename | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p'  | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > $fname.fasta
done

Это сохраняет базовое имя файла в $ fname , так что:

/Test/abcd.fastqsanger становится /Test/abcd.fasta вместо /Test/abcd.fastqsanger.fasta

-1
28.01.2020, 01:12

Теги

Похожие вопросы