我有50个文件夹,每个文件夹都有不同数量的文件,这些文件是命令行工具的输入。
#for f in ./*shuf; do #lists all the directories
#FILES=${f}/*.fastq #to get all the fastq files in the directory
FILES="./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_f.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_f.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_f.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_r.fastq"我需要做的是将文件划分为它们各自的对(每个文件名为一个r和一个f),分为如下(对于一个文件名):
echo $PAIR
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_f.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_r.fastq我将把它作为需要以这种格式输入的输入。
(`basename ${PAIR%_*}; $PAIR`):
C115_7.121017_1 ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_f.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_r.fastq然后遍历所有的配对。
我试着做这件事
IFS=' ' read -ra ADDR <<< "$FILES"
echo "${ADDR[ ]}"但是我被困在了一个错误${ADDR[ ]}: bad substitution上。请你给我解释一下这个方法,因为我真的很想学。
编辑:
澄清一点:
这在某种程度上是我希望得到的输出:
IFS=' ' read -ra ADDR <<< "$FILES"
pairs="${ADDR[@]}"
for afile in ${pairs}; do bfile=${afile%_*}; echo ${bfile}_r.fastq ${bfile}_f.fastq; done但没有复制:
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_f.fastq
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121017_1_f.fastq
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_f.fastq
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121103_1_f.fastq
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_f.fastq
./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_r.fastq ./74.C115_7.merge.align.rg.sorted.rmdup.shuf/C115_7.121214_1_f.fastq发布于 2014-07-03 17:55:36
shopt -s nullglob
KEYS=()
declare -A MAP=()
for D in ./*shuf; do
for F in "$D"/*.fastq; do
KEY=${F##*/} KEY=${KEY%_*}
[[ -z ${MAP[$KEY]} ]] && KEYS+=("$KEY")
MAP[$KEY]+=" $F"
done
for KEY in "${KEYS[@]}"; do
echo "${KEY}${MAP[$KEY]}"
done
KEYS=()
MAP=()
done或
shopt -s nullglob
KEYS=()
declare -A MAP=()
for D in ./*shuf; do
for F in "$D"/*.fastq; do
KEY=${F##*/} KEY=${KEY%_*}
[[ -z ${MAP[$KEY]} ]] && KEYS+=("$KEY")
MAP[$KEY]+=" $F"
done
done
for KEY in "${KEYS[@]}"; do
echo "${KEY}${MAP[$KEY]}"
done您需要Bash4.0或更高版本。祝好运。
发布于 2014-07-03 17:39:52
for f in *shuf; do
files=( "$f"/*.fastq ) # an array of files, NOT a string
for file in "${files[@]}"; do # expands each element into a separate parameter
# write output; note that this is DANGEROUS because it's newline-terminating
# ...filenames which can potentially themselves contain newlines.
printf '%s %s\n' "$(basename "${file%_*}")" "$file"
done
donehttps://stackoverflow.com/questions/24559641
复制相似问题