Создайте файл с образцом, геном и количеством строк - linux - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь создать файл с именем depths, который содержит имя образца, ген, а затем количество раз, которое ген присутствует в образце. Нижеприведенный код - это то, что у меня есть в настоящее время, но на выходе есть только имена файлов. Ex. имя файла = 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

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Если я понимаю, что вы пытаетесь сделать, вам нужно еще несколько шагов, чтобы изолировать первую часть имени файла (например, ERR034597) и ген (например, MTCYB), прежде чем записывать информацию в depths . Вам также необходимо учитывать, заменяете ли вы содержимое depths на каждой итерации (например, используя >) или Добавляя к depths на >>.

Поскольку ваш тег [Linux], все, что мы можем предположить, это оболочка POSIX, а не расширенная оболочка, такая как bash. Чтобы удалить расширение .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 строки)

Посмотрите все и дайте мне знать, если у вас возникнут дополнительные вопросы.

0 голосов
/ 05 мая 2020

Здесь

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 и всегда заключать в кавычки переменные, содержащие имена файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...