Удалить каталоги, если у них нет новых файлов

Для показанного вами простого примера, где все последовательности умещаются на одной строке, вы можете просто использовать grep (если ваш grep не поддерживает опцию --no-group-separator, пропустите вывод через grep -v -- '--'):

$ grep -wEA1 --no-group-separator 'chr1|chr2|chr21|chrX' file.fa 
>chr1
ACGGTGTAGTCG
>chr2
ACGTGTATAGCT
>chr21
ACGTTGATGAAA
>chrX
GTACGGGGGTGG

Предполагая, что у вас есть многострочные последовательности (что кажется вероятным, если вы имеете дело с хромосомами), вам нужно сначала объединить их в одну строку. Это значительно усложняет задачу. Можно использовать awk:

$ awk -vRS=">" 'BEGIN{t["chr1"]=1;t["chr2"]=1;t["chr21"]=1;t["chrX"]=1}
                {if($1 in t){printf ">%s",$0}}' file.fa
>chr1
ACGGTGTAGTCG
>chr2
ACGTGTATAGCT
>chr21
ACGTTGATGAAA
>chrX
GTACGGGGGTGG

Сценарий выше устанавливает разделитель записей на > (vRS=">"). Это означает, что "строки" определяются >~, а не \n. Затем, блок BEGIN устанавливает массив, где каждый из идентификаторов целевой последовательности является ключом. Остальное просто проверяет каждую "строку" (последовательность) и, если 1-е поле находится в массиве ($i в t), печатает текущую "строку" ($0), которой предшествует >.

Если вы собираетесь делать подобные вещи часто, запись массива быстро надоест. Лично я использую два приведенных ниже скрипта, которые я унаследовал от бывшего соседа по лаборатории, для преобразования FASTA в формат tbl (sequence_namesequence, по одной последовательности в строке) и обратно:

  • FastaToTbl

    #!/usr/bin/awk -f
    {
     if (substr($1,1,1)==">")
     if (NR>1)
     printf "\n%s\t", substr($0,2,length($0)-1)
     else 
     printf "%s\t", substr($0,2,length($0)-1)
     else 
     printf "%s", $0
    }END{printf "\n"}
    
  • TblToFasta

    #! /usr/bin/awk -f
    {
     sequence=$NF
    
     ls = length(sequence)
     is = 1
     fld = 1
     while (fld "}
     printf "%s " , $fld
     если (fld == NF-1){
     printf "\n"
     }
     fld = fld+1
     }
     while (is 

Если вы сохраните их в $PATH и сделаете исполняемыми, вы можете просто grep для ваших целевых последовательностей (и это будет работать для многострочных последовательностей, в отличие от вышеприведенного):

$ FastaToTbl file.fa | grep -wE 'chr1|chr2|chr21|chrX' | TblToFasta
>chr1 
ACGGTGTAGTCG
>chr2 
ACGTGTATAGCT
>chr21 
ACGTTGATGAAA
>chrX 
GTACGGGGGTGG

Это гораздо проще расширить, поскольку вы можете передать grep файл с целями поиска:

$ cat ids.txt 
chr1
chr2
chr21
chrX

$ FastaToTbl file.fa | grep -wFf ids.txt | TblToFasta
>chr1 
ACGGTGTAGTCG
>chr2 
ACGTGTATAGCT
>chr21 
ACGTTGATGAAA
>chrX 
GTACGGGGGTGG

Наконец, если вы будете работать с большими последовательностями, вы можете рассмотреть возможность приобретения одного из различных инструментов, которые могут делать такие вещи за вас. Они будут намного быстрее и эффективнее в долгосрочной перспективе. Например, fastafetch из набора exonerate suite. Он доступен в репозиториях большинства дистрибутивов Linux. В системах на базе Debian вы можете установить его, например, с помощью sudo apt-get install exonerate. После установки вы можете сделать:

## Create the index    
fastaindex -f file.fa -i file.in
## Loop and retrieve your sequences
for seq in chr1 chr2 chr21 chrX; do
     fastafetch -f file.fa -i file.in -q "$seq" 
done 
>chr1
ACGGTGTAGTCG
>chr2
ACGTGTATAGCT
>chr21
ACGTTGATGAAA
>chrX
GTACGGGGGTGG

В качестве альтернативы вы можете использовать мой собственный retrieveseqs.pl, который имеет несколько других полезных функций:

$ retrieveseqs.pl -h

    retrieveseqs.pl will take one or more lists of ids and extract their sequences from 
    multi FASTA file

    USAGE : retrieveseqs.pl [-viofsn]  

    -v : verbose output, print a progress indicator (a "." for every 1000 sequences processed)
    -V : as above but a "!" for every desired sequence found.
    -f : fast, takes first characters of name "(/^([^\s]*)/)" given until the first space as the search string
         make SURE that those chars are UNIQUE.
    -i : use when the ids in the id file are EXACTLY identical
         to those in the FASTA file
    -h : Show this help and exit.
    -o : will create one fasta file for each of the id files
    -s : will create one fasta file per id
    -n : means that the last arguments (after the sequence file)
         passed are a QUOTED list of the names desired.
    -u : assumes uniprot format ids (separated by |)

В вашем случае вы сделаете:

$ retrieveseqs.pl -fn file.fa "chr1 chr2 chr21 chrX"
[7 (4/4 found]
>chr1
ACGGTGTAGTCG
>chr2
ACGTGTATAGCT
>chr21
ACGTTGATGAAA
>chrX
GTACGGGGGTGG

Обратите внимание, что это то, что я написал для своей работы, и оно не очень хорошо документировано или поддерживается. Тем не менее, я с удовольствием пользуюсь им уже много лет.

0
06.11.2018, 20:35
2 ответа

Я бы перебрал рассматриваемые каталоги (здесь, каждый подкаталог текущего каталога )и подсчитал количество строк, которые выводятся find; если это число равно нулю, удалите каталог. Команда findпросто запрашивает файлы в заданном каталоге, возраст которых меньше «N» дней (и которые были изменены за последние «N» дней ).

N=3
for dir in */
do
  count=$(find "$dir" -type f -mtime -"$N" -print | wc -l)
  [ "$count" -eq 0 ] && echo rm -r -- "$dir"
done

Удалите echo, если результаты выглядят правильно.

1
28.01.2020, 02:41

Моя идея такова:

 touch -d "4 days ago".reference_file  
 for dir in */  
 do  
   [ $dir -ot.reference_file ] && rm -rf "$dir"  
 done

Сначала мы создаем файл.reference _с датой создания «4 дня назад».

Тогда,для всех каталогов в этом рабочем каталоге мы проверяем, что его время модификации старше(-otоператор ), чем время модификации файла.reference _.

Если -, мы удаляем этот каталог с помощьюrm -rf $dir

Каждый раз, когда мы запускаем этот скрипт, дата модификации файла.reference _будет обновляться на 4 дня раньше.

0
28.01.2020, 02:41

Теги

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