我有一个文件,其名称如下:
12U12345._L001_R1_001.fastq.gz
我想将变量分配给12U12345
部分。
到目前为止,我有:
variable=`basename $fastq | sed {s'/_S[0-9]*_L001_R1_001.fastq.gz//'}`
注意:$fastq
是一个变量,其中包含文件的完整路径。
此解决方案目前返回完整的文件名,任何想法如何做到这一点?
答案 0 :(得分:5)
只需使用shell提供的内置参数扩展,而不是生成单独的进程
fastq="12U12345._L001_R1_001.fastq.gz"
printf '%s\n' "${fastq%%.*}"
12U12345
或使用printf()
本身存储到一次性
printf -v numericPart '%s' "${fastq%%.*}"
printf '%s\n' "${numericPart}"
同样bash
有一个内置的正则表达式比较运算符,由=~
表示,您可以使用
fastq="12U12345._L001_R1_001.fastq.gz"
regex='^([[:alnum:]]+)\.(.*)'
if [[ $fastq =~ $regex ]]; then
numericPart="${BASH_REMATCH[1]}"
printf '%s\n' "${numericPart}"
fi
答案 1 :(得分:2)
您可以使用cut
:
$> fastq="/path/to/12U12345._L001_R1_001.fastq.gz"
$> variable=$(basename "$fastq" | cut -d '.' -f 1)
$> echo "$variable"
12U12345
另外,请注意:
最好将变量包装在引号内。否则,您的命令将无法使用包含空格的文件名。
您应该使用$()
代替反对。
答案 2 :(得分:2)
使用Bash Parameter Expansion提取基本名称,然后提取所需文件名的部分:
fastq="/path/to/12U12345._L001_R1_001.fastq.gz"
file="${fastq##*/}" # gives 12U12345._L001_R1_001.fastq.gz
string="${file%%.*}" # gives 12U12345
请注意,Bash不允许我们嵌套参数扩展。否则,我们可以将上面的陈述2和3结合起来。