如何在 mac 终端中一次性运行一个命令来处理文件夹中的多个文件?

如何在 mac 终端中一次性运行一个命令来处理文件夹中的多个文件?

如何在 mac 终端中对文件夹中的多个文件运行相同的命令?这些文件的名称类似于24538_7#1_paired1.fq24538_7#1_paired2.fq24538_7#2_paired1.fq24538_7#2_paired2.fq24538_7#3_paired1.fq24538_7#3_paired2.fq等。

命令是:

STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/24538_7#1_paired1.fq data/24538_7#1_paired2.fq --outFileNamePrefix results/STAR/ 

由于文件名涉及计数器,因此显然需要更改文件名。

我试图编写命令,但它给出了分段错误。我对该命令的努力如下:

for file in 24538_7#*.fq; do STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%.fq}_paired1.fq" data/"${file%.fq}_paired2.fq" --outFileNamePrefix results/STAR/ ; done

(PS-我使用MacOS)

答案1

循环遍历所有paired1.fq文件,并针对每个此类文件,使用名称来计算相应paired2.fq文件的名称。然后用这些调用您的程序:

for paired1 in data/*paired1.fq; do
    paired2="${paired1%1.fq}2.fq"  # remove 1.fq from end of name and replace with 2.fq

    if [ ! -f "$paired2" ]; then
        printf 'Missing file:\t%s\n' "$paired2" >&2
        continue
    fi

    prefix="${paired1%_*}" # remove last underscore and everything after
    prefix="${prefix##*/}" # remove directory name from prefix

    # If $paired1 is the string "data/24538_7#1_paired1.fq", then
    # $prefix should now be "24538_7#1"

    mkdir -p "results/STAR/$prefix"

    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic \
         --readFilesIn "$paired1" "$paired2" \
         --outFileNamePrefix "results/STAR/$prefix/"
done

答案2

您的参数扩展修剪得不够。

您正在设置file

file=24538_7#1_paired1.fq

然后修剪.fq

$ echo ${file%.fq}
24538_7#1_paired1

然后添加_paired1.fq

$ echo "${file%.fq}_paired1.fq"
24538_7#1_paired1_paired1.fq

尝试这样:

for file in 24538_7#*.fq; do 
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"${file%_paired?.fq}_paired1.fq" data/"${file%_paired?.fq}_paired2.fq" --outFileNamePrefix results/STAR/
done

不过,由于每对都有两个文件,因此每对将运行两次。我认为这可能不是您所需要的。


要每对运行一次,您可以执行以下操作:

#!/bin/bash

files=( 24538_7#*.fq )
files=( printf '%s\n' "${files[@]#24538_7#}" | sort -n | awk -F_ '{print $1}' | uniq )

for n in "${files[@]}"; do
    STAR --runThreadN 12 --genomeDir indices/STAR --twopassMode Basic --readFilesIn data/"24538_7#${n}_paired1.fq" data/"24538_7#${n}_paired2.fq" --outFileNamePrefix results/STAR/ 
done

相关内容