Давайте по частям переведем с Python на Bash.
Python:
#! / Usr / bin / env python3 import sys, os linelist = list (sys.stdin) { {1}}
Bash:
#!/usr/bin/env bash
linelist=()
while IFS= read -r line; do
linelist+=("$line")
done
Python:
# получает самую большую строку big_line_size = 0 для строки в списке строк: line_lenght = len (line ) если длина_линии> размер_большей_линии: размер_большей_линии = длина_строки
Bash:
biggest_line_size=0
for line in "${linelist[@]}"; do
# caveat alert: the length of a tab character is 1
line_length=${#line}
if ((line_length > biggest_line_size)); then
biggest_line_size=$line_length
fi
done
Python:
столбцы = int (os.popen ('tput cols', 'r'). read ()) смещение = размер самой большой_линии / 2 perfect_center = columns / 2 padsize = int (perfect_center - offset) spacing = ' '* padsize # space char
Bash:
columns=$(tput cols)
# caveat alert: division truncates to integer value in Bash
((offset = biggest_line_size / 2))
((perfect_center = columns / 2))
((padsize = perfect_center - offset))
if ((padsize > 0)); then
spacing=$(printf "%*s" $padsize "")
else
spacing=
fi
Python:
text = str () для строки в списке строк: text + = (spacing + строка) divider = spacing + ('─' * int (most_line_size)) # unicode 0x2500 text + = divider print ( text, end = "\ n" * 2)
Bash:
for line in "${linelist[@]}"; do
echo "$spacing$line"
done
printf $spacing
for ((i = 0; i < biggest_line_size; i++)); do
printf -- -
done
echo
Полный сценарий для упрощения копирования и вставки:
#!/usr/bin/env bash
linelist=()
while IFS= read -r line; do
linelist+=("$line")
done
biggest_line_size=0
for line in "${linelist[@]}"; do
line_length=${#line}
if ((line_length > biggest_line_size)); then
biggest_line_size=$line_length
fi
done
columns=$(tput cols)
((offset = biggest_line_size / 2))
((perfect_center = columns / 2))
((padsize = perfect_center - offset))
spacing=$(printf "%*s" $padsize "")
for line in "${linelist[@]}"; do
echo "$spacing$line"
done
printf "$spacing"
for ((i = 0; i < biggest_line_size; i++)); do
printf ─ # unicode 0x2500
done
echo
Деление в Bash усекается. Таким образом, значения смещения
, perfect_center
и padsize
могут немного отличаться.
Есть некоторые проблемы, которые существуют и в исходном коде Python:
Длина символа табуляции равна 1. Иногда из-за этого разделительная линия будет выглядеть короче самой длинной строки, например:
Q : Почему тахион перешел дорогу?
A: Потому что он был на другой стороне.
────────────────────── ─────────────────
Если некоторые строки длиннее, чем столбцов
, для разделительной линии, вероятно, лучше использовать длину столбцы
вместо самой длинной строки.
Я хочу напечатать все строки, начинающиеся со знака ">" и следующая строка , но есть условие: строка, начинающаяся со знака ">", должна содержать букву V.
Эта grep
, похоже, работает:
grep -A 1 '^">.*V'
Пример:
grep -A 1 '^">.*V' file
">0VC3_7 M01230:42:000000000-AWMRD:1:1101:15805:1805 1:N:0:0 TCATGAAGAACTCCGATCGCGAAGGCAAGTGTCCGGGGTGCAACTGACGCTGAGGCTCGAA
">11VI2_15 M01230:42:000000000-AWMRD:1:1101:17657:1817 1:N:0:0
GCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTGGGGAGCAAACAGGGCTC
Используя GNU sed
(стандарт в системе Linux), вы можете получить строку заголовка (содержащую V
где угодно на it) и первая строка последовательности из файла fasta, например:
sed -n '/^>.*V/,+1p' sequence.fa
Предполагается, что файл fasta правильно f орнаментированный.
-n
отключает вывод по умолчанию, а / ^>. * V /, + 1p
выводит любую строку заголовка с V
в нем. вместе со следующей строкой.
Вы сказали:
Я хочу напечатать все строки, начинающиеся со знака ">", и следующую строку, но есть условие, что строка начинается с Знак ">" должен содержать букву V
Это хорошая работа для awk:
$ awk '/^">.*V/{print $0;getline line; print line}' input.txt
">0VC3_7 M01230:42:000000000-AWMRD:1:1101:15805:1805 1:N:0:0
TCATGAAGAACTCCGATCGCGAAGGCAAGTGTCCGGGGTGCAACTGACGCTGAGGCTCGAA
">11VI2_15 M01230:42:000000000-AWMRD:1:1101:17657:1817 1:N:0:0
GCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTGGGGAGCAAACAGGGCTC