awk/sed 文件名的一部分

awk/sed 文件名的一部分

每当我将文件名作为参数传递到命令行时,我只想使用 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

相关内容