У меня есть файл с несколькими последовательностями, проблема в том, что после id есть пробел, а затем фактическая последовательность, я хочу добавить строку прерывания между id и фактической последовательностью.
Это то, что у меня есть:
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
Вот что я хочу, чтобы он выглядел так:
UniRef90_Q8YC41 Putative binding protein BMEII0691
MNRFIAFFRSVFLIGLVATAFGRACA
Если это возможно, я бы предпочел, чтобы это выглядело так
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
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 - это файл, в котором у вас сохранены последовательности.
В этом ответе:
bash + xargs однострочный python однострочный Ruby однострочный$> 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
Этот 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
В этом одном лайнере флаг -n работает как цикл while gets . . . end. $_ содержит значение каждой прочитанной строки, поэтому для каждой строки мы разбиваем ее на массив слов, а затем печатаем первый и последний.
$ ruby -ne 'words=$_.split(); puts words[0],words[-1]' < input_file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA