Как я могу добавить строку повреждения после заголовка последовательности и перед фактической последовательностью?

У меня есть файл с несколькими последовательностями, проблема состоит в том, что после того, как идентификатор там является пространством и затем фактической последовательностью, я хочу добавить строку повреждения между идентификатором и фактической последовательностью.

Это - то, что я имею:

UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA

Это - то, на что я хочу, чтобы это было похоже:

UniRef90_Q8YC41 Putative binding protein BMEII0691
MNRFIAFFRSVFLIGLVATAFGRACA

Если его возможное я быть бы он быть похожим на это

UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
6
задан 19 August 2016 в 14:48

3 ответа

  • Используя awk, печать первого и последнего поля с \n как разделитель:

    awk '{printf "%s\n%s\n", $1, $NF}' file.txt
    
  • Используя sed, получение первого и последнего поля при соответствии и использовании в замене:

    sed -E 's/([^[:blank:]]+).*[[:blank:]]([^[:blank:]]+)$/\1\n\2/' file.txt
    
  • С perl, подобная логика к sed:

    perl -pe 's/^([^\s]+).*\s([^\s]+)/$1\n$2/' file.txt
    
  • Используя bash, более медленный подход, создавая массив из каждой строки и печатая первый и последний элемент от массива, разделяющего их \n:

    while read -ra line; do printf '%s\n%s\n' "${line[0]}" \
           "${line[$((${#line[@]]}-1))]}"; done <file.txt
    
  • С python, создание списка, содержащего пробел, разделило элементы от каждой строки, затем печатая первый и последний элемент из списка, отделившись \n:

    #!/usr/bin/env python3
    with open("file.txt") as f:
        for line in f:
            line = line.split()
            print(line[0]+'\n'+line[-1])
    

Пример:

$ cat file.txt                               
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA

$ awk '{printf "%s\n%s\n", $1, $NF}' file.txt                             
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

$ sed -E 's/([^[:blank:]]+).*[[:blank:]]([^[:blank:]]+)$/\1\n\2/' file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

$ perl -pe 's/^([^\s]+).*\s([^\s]+)/$1\n$2/' file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA


$ while read -ra line; do printf '%s\n%s\n' "${line[0]}" "${line[$((${#line[@]]}-1))]}"; done <file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

>>> with open("file.txt") as f:
...     for line in f:
...         line = line.split()
...         print(line[0]+'\n'+line[-1])
... 
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
10
ответ дан 23 November 2019 в 07:16

Версия

File.open(ARGV[0]) do |f|
  f.each do |line|
    puts "#{line.partition(' ')[0] + "\n" + line.rpartition(' ')[-1]}"
  end
end

Ruby Сохраняет его, как любое имя говорит line_breaker.rb и выполняет его с ruby line_breaker.rb file.txt, в то время как file.txt является файлом, где Вам сохранили последовательности.

6
ответ дан 23 November 2019 в 07:16

В этом ответе:

  1. bash + xargs острота
  2. python острота
  3. Ruby острота

1. bash + xargs версия.

$> cat input_file.txt  | xargs -L 1 bash -c 'for i; do : ; done ; echo $1;echo $i' bash 

Это по существу дает каждую строку для избиения как параметры командной строки, цикл, пока мы не получаем последний, и повторяют их.

Демонстрация:

$> cat input_file.txt                                                                     
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
$> cat input_file.txt  | xargs -L 1 bash -c 'for i; do : ; done ; echo $1;echo $i' bash   
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

Еще более короткая версия:

$> cat input_file.txt  | xargs -L 1 bash -c 'echo $1;echo ${@: -1}' bash                  
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

2.python острота

Эта острота собирает список строк, которые являются в основном первым словом + новая строка + последнее слово. Наконец, это печатает все элементы списка как одну строку, к которой присоединяются с новой строкой.

python -c 'import sys ; print "\n".join([ l.split()[0] + "\n" + l.split()[-1]  for l in sys.stdin ])' < input_file.txt

Демонстрация использования:

$ python -c 'import sys ; print "\n".join([ l.split()[0] + "\n" + l.split()[-1]  for l in sys.stdin ])' < input_file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA

3. Ruby один лайнер

В этом лайнере, -n отметьте работы как while gets . . . end цикл. $_ содержит значение каждого чтения строки, таким образом, на каждую строку мы разделяем его на массив слов и затем печатаем в общем и целом один.

$ ruby -ne 'words=$_.split(); puts words[0],words[-1]' < input_file.txt                   
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
6
ответ дан 23 November 2019 в 07:16

Другие вопросы по тегам:

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