문자 사이의 모든 것을 추출

문자 사이의 모든 것을 추출

다음과 같은 텍스트 파일이 여러 개 있습니다.

샘플1.tsv

## index of replication (iRep) - thresholds: min cov. = 5, min wins. = 0.98, min r^2 = 0.9, max fragments/Mbp = 175, GC correction min r^2 = 0.0    
# genome    ./bam/18097D-02-01.sam.sorted.sam
18097D-02-01_bin.11.fa  1.295179372
18097D-02-01_bin.13.fa  1.284880274
18097D-02-01_bin.15.fa  1.339609918
#   
## un-filtered index of replication (iRep)  
# genome    ./bam/18097D-02-01.sam.sorted.sam
18097D-02-01_bin.11.fa  1.295179372
18097D-02-01_bin.13.fa  1.284880274
18097D-02-01_bin.15.fa  1.339609918
#   
## raw index of replication (no GC bias correction) 
# genome    ./bam/18097D-02-01.sam.sorted.sam
18097D-02-01_bin.11.fa  1.298934455
18097D-02-01_bin.13.fa  1.2885746
#

샘플2.tsv

## index of replication (iRep) - thresholds: min cov. = 5, min wins. = 0.98, min r^2 = 0.9, max fragments/Mbp = 175, GC correction min r^2 = 0.0    
# genome    ./bam/18097D-02-02.sam.sorted.sam
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
#   
## un-filtered index of replication (iRep)  
# genome    ./bam/18097D-02-02.sam.sorted.sam
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
#   
## raw index of replication (no GC bias correction) 
# genome    ./bam/18097D-02-02.sam.sorted.sam
18097D-02-02_bin.11.fa  1.603339021
18097D-02-02_bin.13.fa  1.366124796
18097D-02-02_bin.14.fa  1.502052999
18097D-02-02_bin.6.fa   1.324573575
18097D-02-02_bin.9.fa   1.618136032
#   

첫 번째 ##부터 두 번째 ##까지 모든 파일에서 모든 내용을 추출하고 싶습니다. 이는 출력을 원한다는 의미입니다.

## index of replication (iRep) - thresholds: min cov. = 5, min wins. = 0.98, min r^2 = 0.9, max fragments/Mbp = 175, GC correction min r^2 = 0.0    
# genome    ./bam/18097D-02-01.sam.sorted.sam
**18097D-02-01_bin.11.fa 1.295179372
18097D-02-01_bin.13.fa 1.284880274
18097D-02-01_bin.15.fa 1.339609918**
#   
## un-filtered index of replication (iRep)
## index of replication (iRep) - thresholds: min cov. = 5, min wins. = 0.98, min r^2 = 0.9, max fragments/Mbp = 175, GC correction min r^2 = 0.0    
# genome    ./bam/18097D-02-02.sam.sorted.sam
**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**
#   
## un-filtered index of replication (iRep)

이 작업을 시도했지만 sed -n '/##=/{s/에서 출력이 없습니다.#=//;s/\S=.*//;p}' *.tsv > ../test.tsv

사실 난--

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

감사해요

답변1

사용 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인 경우(첫 번째부터 두 번째까지의 경우이고 ##줄이 a로 시작하지 않는 경우 #인쇄합니다.

답변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

관련 정보