首页 > 解决方案 > 创建一个包含样本、基因和行数的文件 - linux

问题描述

我正在尝试创建一个名为 depths 的文件,其中包含样本名称、基因以及该基因在样本中的次数。下面的代码是我目前拥有的,但输出只有文件名。前任。文件名=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

标签: linuxshell

解决方案


如果我理解您的尝试,那么您需要更多步骤来隔离文件名的第一部分(例如ERR034597)和基因(例如MTCYB),然后再将信息写入depths. 您还需要考虑是depths在每次迭代中替换 的内容(例如 using >)还是Appending to depthswith >>

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

#!/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 行)

如果您还有其他问题,请仔细查看并告诉我。


推荐阅读