разбить файл multifasta на разные файлы с новыми заголовками

Меня интересовал тот же вопрос, поэтому я провел небольшой тест (на ядре 4.20.0, используя unshare from util -linux 2.33; man-страница для unshare в этой версии содержит некоторые заметки об общем/частном монтировании, которые стоит прочитать, и YMMV, если вы используете более старую версию ).

TL;DR:Да, файловая система размонтируется, когда завершается последний процесс в пространстве имен.


В моем случае я тестирую устройство dm-6, и оно не смонтировано во «внешнем» пространстве имен.

Окно 1:

cd /sys/fs/ext4
ls -d dm-6
# No such file or directory
Окно 2 :
unshare -m
mount /dev/dm-6 /mnt/tmp
# don't exit yet, keep the namespace active
Окно 3 :Сделайте то же самое, что и окно 1.

Окно 1:

ls -d dm-6
# exists now

Окно 2 :Выход из среды unshare

Окно 1 :Проверьте еще раз, dm-6все еще существует

Окно 3 :Выход из среды unshare

Окно 1 :Проверить еще раз, dm-6снова нет


Еще одна полезная демонстрация/тест :Аналогичная идея, но вместо 3 окон вход и выход из окна 2 дважды. Проверьте dmesgили журналы и убедитесь, что в этом случае сообщение ядра о том, что оно смонтировало файловую систему, появляется дважды.

-1
04.02.2021, 21:13
4 ответа
count=`awk 'END{print NR}' filename`

for ((i=1;i<=$count;i++)); do j=$(($i+1)); m=`awk -F "|" -v i="$i" 'NR==i{k=substr($4,1,8);print k"_"$5}' filename`; echo $m >"$m.fasta";echo -e "\n" >> "$m.fasta" ;awk -v j="$j" 'NR==j {print $0}' filename >> "$m.fasta";i=$j; done

Проверено, работает нормально

-7
18.03.2021, 22:32
awk -F'|' '
    NR%2{ close(fileName); hdr=$4 $5; sub("annot.gbk", "", hdr); fileName=hdr".fasta";
          print ">"hdr >fileName; next; };
        { print >fileName; }' infile
4
18.03.2021, 22:32

Решение, отличное от awk, предполагающее, что файл должен быть разделен каждые 2 строки:


# split the file every 2 lines and save in files prefixed FOO.
split -l2 131751_pphA.fasta FOO.

# loop over the files
for f in FOO.*; do 
  # `awk` and `sed` to get the pattern to use as file name and first line, i.e "PANS_1_2_pphA"
  n=$(awk -F'|' '{ print $4$5 }' "$f" | \
    sed 's/annot\.gbk//')

  # copy the 2nd line of the file into a new file named as pattern+.fasta
  sed -n 2p "$f" > "$n.fasta"

  # add the pattern in the created file
  sed -i "1i>\\$n" "$n.fasta"

  # remove the splited files
  rm "$f"
done

$ cat PANS_1_2_pphA.fasta 
PANS_1_2_pphA
MIKKLIAEKGTLIFIEAHNPLSALIASKAEQTNSEGRIVKFDGIWSSSLTDSASRGIPDNETLALSSRLENIADIRNVTDMPIIMDADTGGKPEHFSYYVKRMINNGVNGVIIEDKTGLKKNSLFGTEVEQTLADINDFSEKIKRGKSAVYIDDFMIIARLESLIAGFDVEHALERADAYVEAGADGIMIHSCKKTPDEVFLFSTKFRKKYPSVPLICVPTTYSATSNRELSEAGFNVIIYANHMLRAAYKAMENVSKEILRYGRTAEIEKSCMSVKEIISLIP


1
18.03.2021, 22:32
awk -F '|' '
    /^>/ {
        close(out)
        head = $4
        sub("_[^_]*$","_" $5, head)
        $0 = ">" head
        out = head ".fasta"
    } { print >out }' 131751_pphA.fasta

Это похоже на ответ αғsнιη , но позволяет каждой последовательности состоять из более чем одной строки (, что возможно в общем файле FastA ).

Я также обрезаю имя заголовка немного по-другому, обрезая все после последнего _в .gbkимени файла (? ), который находится в четвертом|-поле с разделителями в строке заголовка FastA, и добавление пятого поля.

0
01.04.2021, 16:44

Теги

Похожие вопросы