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

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

Это то, что у меня есть:

UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA

Вот что я хочу, чтобы он выглядел так:

UniRef90_Q8YC41 Putative binding protein BMEII0691
MNRFIAFFRSVFLIGLVATAFGRACA

Если это возможно, я бы предпочел, чтобы это выглядело так

UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
1
задан 20 August 2016 в 00:48

2 ответа

Ruby Version

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

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

6
ответ дан 23 May 2018 в 06:59

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

bash + xargs однострочный python однострочный Ruby однострочный

1. bash + xargs version.

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

Это по существу дает каждой строке 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 однострочный

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

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 one liner

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

$ ruby -ne 'words=$_.split(); puts words[0],words[-1]' < input_file.txt                   
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
6
ответ дан 23 May 2018 в 06:59
  • 1
    Спасибо @serg, я позже займу курс на python, чтобы узнать, как его использовать. Еще раз спасибо. – asp2_downhill 20 August 2016 в 19:42

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

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