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

我在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 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很容易出错,带空格的文件名可以解释为单独的文件,而不是一个

  • 我想我只是对bash缺乏经验-我的目标是将列表与其他两个类似的元素一起传递给程序(其中一个是
    $one
    )。这很有帮助!谢谢