每当我将文件名作为参数传递到命令行时,我只想使用 awk/sed 文件名的前缀。
例如,
我有多个文件:
a.fastq.gz
b.fastq.gz
c.fastq.gz
d.fastq.gz
如果我执行:
sh test.sh --INFILE b.fastq.gz
我想要的输出是:
b
我尝试过但失败的是,
prefix="sed 's/.fastq//' ${INFILE}"
答案1
使用 shell 参数扩展(假设您将文件名分配给INFILE
):
INFILE=b.fastq.gz
prefix=${INFILE%%.*}
或者,如果您的后缀肯定是固定的,并且您想要更精确(如果可能,始终建议):
prefix=${INFILE%.fastq.gz}
${parameter%word}
${parameter%%word}
该单词被扩展以产生模式并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式匹配 如果模式与参数扩展值的尾部部分匹配,则扩展的结果是具有最短匹配模式(“%”情况)或最长匹配模式(“%”情况)的参数值%' 案例)已删除。如果参数是“@”或“',模式移除操作依次应用于每个位置参数,扩展是结果列表。如果参数是一个数组变量,下标为“@”或“',模式删除操作依次应用于数组的每个成员,扩展就是结果列表。
答案2
使用标准basename
实用程序删除已知后缀:
$ basename b.fastq.gz .fastq.gz
b
使用变量:
$ pathname="/some/path/name.fastq.gz"
$ basename "$pathname" .fastq.gz
name
分配给变量:
$ prefix=$( basename "$pathname" .fastq.gz )
$ printf 'Prefix is "%s"\n' "$prefix"
Prefix is "name"
在循环中(遍历.fastq.gz
当前目录中的所有文件):
for filename in ./*.fastq.gz; do
prefix=$( basename "$filename" .fastq.gz )
# Do things using "$prefix" here
done
答案3
让我按步骤修复您尝试过的内容,以便您可以看到您在做什么:
$ INFILE=b.fastq.gz; prefix="sed 's/.fastq//' ${INFILE}"; echo "$prefix"
sed 's/.fastq//' b.fastq.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' ${INFILE})"; echo "$prefix"
sed: can't read b.fastq.gz: No such file or directory
$ INFILE=b.fastq.gz; prefix="$(sed 's/.fastq//' <<< ${INFILE})"; echo "$prefix"
b.gz
$ INFILE=b.fastq.gz; prefix="$(sed 's/\.fastq.*//' <<< ${INFILE})"; echo "$prefix"
b