извлечь все, что находится между символами

Вы можете переосмыслить всю концепцию. Это простой фрагмент, который поможет вам двигаться вперед.

#!/usr/bin/env bash

a=1
b=45


while read -p 'Please answer: ' answer
do
   re=$(printf '%s\n' "$answer" | tr -dc '[[:digit:]]')
   if ((re < a || re > b)); then
       read -p 'Please answer: ' $re
   else
       echo "Loop ended"
       exit 
   fi
 done
1
17.10.2019, 23:55
2 ответа
#!/bin/bash
sample_dir="/C/Users/testuser/Desktop/sample" 
out_file="/C/Users/testuser/Desktop/sample/output.tsv"

for file in "$sample_dir"/*
do
   count=0
   while read line; do
        if [[ "$line" == "##"* ]] || [[ "$line" == "#"* ]]; then
           count=$((count+1))
           if [[ count -ge 4 ]]; then
              echo -e "" >> $out_file            
              continue 2
           fi
            continue 
        else
           echo -e "$line" >> $out_file
        fi
    done < $file
done
1
27.01.2020, 23:30

Используйтеawk:

awk 'FNR==1{p=0}
     FNR==1 && NR>1 {print ""}
     $0 ~ /^##/ {p++}
     p==1 && $0 !~ /^#/
' sample*

Выход:

18097D-02-01_bin.11.fa  1.295179372
18097D-02-01_bin.13.fa  1.284880274
18097D-02-01_bin.15.fa  1.339609918

18097D-02-02_bin.11.fa  1.59665286
18097D-02-02_bin.13.fa  1.332990306
18097D-02-02_bin.14.fa  1.499196606
18097D-02-02_bin.6.fa   1.323465715
18097D-02-02_bin.9.fa   1.583302299

Пояснение:

  • FNR==1{p=0}установить указатель на 0 для каждого нового файла(FNRэто номер строки текущего файла)
  • FNR==1 && NR>1 {print ""}Печатать пустую строку для каждого файла, кроме первого
  • $0 ~ /^##/ {p++}Если строка начинается с ##, увеличьте указатель
  • p==1 && $0 !~ /^#/Если указатель равен 1 (, что имеет место в случае от первого ##до второго ##, и строка не начинается с #, выведите ее.
2
27.01.2020, 23:30

Теги

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