我正在尝试创建一个名为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行(
仔细看看,如果你还有问题,请告诉我。