创建一个包含sample、gene和行数的文件-linux



我正在尝试创建一个名为depth的文件,该文件包含样本的名称、基因,然后是该基因在样本中的次数。下面的代码是我目前所拥有的,但输出只有文件名。示例文件名=ERR034597.MTCYB.sam

例如,我希望该文件具有ERR034597 MTCYB 327。

for i in genes/${i}.sam
filename=$(basename $i)
n_rows=$(cat $i | wc -l)
echo $filename $n_rows > depths

此处为

for i in genes/${i}.sam

在变量i被分配之前,您正在访问它。这不应该奏效。你可能想做的是

for i in genes/*.sam
filename=$(basename "$i")
n_rows=$(wc -l "$i")
echo "$filename" $n_rows > depths

只是另一个音符。最好避免对cat进行不必要的调用,并始终引用包含文件名的变量。

如果我理解您正在尝试的内容,那么在将信息写入depths之前,您需要再执行几个步骤来分离文件名的第一部分(例如ERR034597(和基因(例如MTCYB(。您还需要考虑是在每次迭代中替换depths的内容(例如使用>(,还是用>>将附加到depths

由于您的标签是[Linux],我们只能假设您有一个POSIX shell,而不是像bash这样的高级shell。要从filename中去除.sam延伸,然后在获得行数之前分离为第一部分和基因,可以执行类似于以下的操作:

#!/bin/sh
:> depths       # truncate depths (optional - if required)
for i in genes/*.sam; do                        # loop over all .sam files
filename="$(basename "$i")"                 # remove path from name
filename="${filename%.sam}"                 # trim .sam extension from name
gene="${filename##*.}"                      # trim to last '.' save as gene
filename="${filename%.$gene}"               # remove gene from end of name
n_rows=$(wc -l < "$i")                      # get number of lines in file
echo "$filename $gene $n_rows" >> depths    # append vales to depths
done

这将导致depths包含类似于的行

ERR034597 MTCYB 92

(其中测试文件包含92行(

仔细看看,如果你还有问题,请告诉我。

相关内容

  • 没有找到相关文章

最新更新