bash中文件名的基本字符串操作
我在bash中有一些文件名,是我用它获得的bash中文件名的基本字符串操作,bash,shell,Bash,Shell,我在bash中有一些文件名,是我用它获得的 $ ones=$(find SRR*pass*1*.fq) $ echo $ones SRR6301033_pass_1_trimmed.fq SRR6301034_pass_1_trimmed.fq SRR6301037_pass_1_trimmed.fq ... 然后我将其转换为一个数组,这样我就可以遍历此列表并使用文件名执行一些操作: # convert to array $ ones=(${ones// / }) 以及迭代: for i
$ ones=$(find SRR*pass*1*.fq)
$ echo $ones
SRR6301033_pass_1_trimmed.fq
SRR6301034_pass_1_trimmed.fq
SRR6301037_pass_1_trimmed.fq
...
然后我将其转换为一个数组,这样我就可以遍历此列表并使用文件名执行一些操作:
# convert to array
$ ones=(${ones// / })
以及迭代:
for i in $ones;
do
fle=$(basename $i)
out=$(echo $fle | grep -Po '(SRR\d*)')
echo "quants/$out.quant"
done
产生:
quants/SRR6301033
SRR6301034
...
...
SRR6301220
SRR6301221.quant
然而,我想要这个:
quants/SRR6301033.quant
quants/SRR6301034.quant
...
...
quants/SRR6301220.quant
quants/SRR6301221.quant
有人能解释一下为什么我正在做的事情不起作用,以及如何纠正它吗?你为什么要这么复杂?您可以去掉所有不必要的环形交叉口,只需使用for循环和内置的参数扩展技术即可完成此操作
# Initialize an empty indexed array
array=()
# Start a loop over files ending with '.fq' and if there are no such files
# the *.fq would be un-expanded and checking it against '-f' would fail and
# in-turn would cause the loop to break out
for file in *.fq; do
[ -f "$file" ] || continue
# Get the part of filename after the last '/' ( same as basename )
bName="${file##*/}"
# Remove the part after '.' (removing extension)
woExt="${bName%%.*}"
# In the resulting string, remove the part after first '_'
onlyFir="${woExt%%_*}"
# Append the result to the array, prefixing/suffixing strings 'quant'
array+=( quants/"$onlyFir".quant )
done
现在打印数组以查看结果
for entry in "${array[@]}"; do
printf '%s\n' "$entry"
done
你的尝试可能会失败
ones=$(find SRR*pass*1*.fq)
将结果存储在变量中,而不是数组中。变量无法区分内容是列表还是由空格分隔的单个字符串echo$ones
即无引号扩展,字符串内容将进行分词。只要有带空格的文件名,您可能看不出有什么不同,使用空格可能会让您将文件名的某些部分解释为不同的文件${ones//}
部分没有意义,因为尝试使用无引号的变量$ones
本身是错误的用于i,单位为$one由于上述原因,code>很容易出错,带空格的文件名可以解释为单独的文件,而不是一个
我想我只是对bash缺乏经验-我的目标是将列表与其他两个类似的元素一起传递给程序(其中一个是
$one
)。这很有帮助!谢谢