как печатать, если строка содержит определенный шаблон, и не печатать, если он не содержит шаблон

Давайте по частям переведем с 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. Длина символа табуляции равна 1. Иногда из-за этого разделительная линия будет выглядеть короче самой длинной строки, например:

      Q : Почему тахион перешел дорогу? 
    A: Потому что он был на другой стороне. 
     ────────────────────── ───────────────── 
     
  2. Если некоторые строки длиннее, чем столбцов , для разделительной линии, вероятно, лучше использовать длину столбцы вместо самой длинной строки.

1
31.01.2017, 09:43
3 ответа

Я хочу напечатать все строки, начинающиеся со знака ">" и следующая строка , но есть условие: строка, начинающаяся со знака ">", должна содержать букву 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
7
27.01.2020, 23:11

Используя GNU sed (стандарт в системе Linux), вы можете получить строку заголовка (содержащую V где угодно на it) и первая строка последовательности из файла fasta, например:

sed -n '/^>.*V/,+1p' sequence.fa

Предполагается, что файл fasta правильно f орнаментированный.

-n отключает вывод по умолчанию, а / ^>. * V /, + 1p выводит любую строку заголовка с V в нем. вместе со следующей строкой.

4
27.01.2020, 23:11

Вы сказали:

Я хочу напечатать все строки, начинающиеся со знака ">", и следующую строку, но есть условие, что строка начинается с Знак ">" должен содержать букву 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
1
27.01.2020, 23:11

Теги

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