2015-01-30 7 views
0

한 줄씩 파일을 읽는 간단한 스크립트를 개발 중이며 각 줄의 내용을 평가하고 라인 번호에 따라 라인 데이터를 처리하십시오. 웬일인지, 공백과 일치하는 정규식을 얻을 수 없습니다. [: space :], [[: space :]], [: blank :], \ s, \, 및 "모두 실패했습니다.if satement에서 [[]]로 구분되는 정규 표현식의 공백과 일치하는 배쉬를 얻을 수 없다.

(fastq 형식)은 다음과 같이 내 데이터 포맷

:

@SRR573708.2 2 length=100 
    AAAACGTTAATATTTATTGAAATTGTT 
    +SRR573708.2 2 length=100 
    HHHHHHHHHHHHHHHHHHHHHHHHHHH 

내가 그것을 다시 포맷하고 싶습니다 :

@SRR573708.2/2 
    AAAACGTTAATATTTATTGAAATTGTT 
    +SRR573708.2/2 
    HHHHHHHHHHHHHHHHHHHHHHHHHHH 

내가하기 위해 각 라인을 확인, 그러나 중요하다 새 파일로 인쇄하기 전에 올바르게 형식화되었는지 확인하십시오. 다시 포맷 된 파일을 생성하기위한 마지막 시도는 파일의 끝에 실제 결과를 만들어 냈습니다. 내 코드는 다음과 같습니다 정규식의 경우 문, 바람직 일치하는 유일한 공간과 탭 문자와 줄 바꿈하지를 공백과 일치하는 방법으로

error at line 1 
    @SRR573708.2 2 length=100 

어떤 제안 :

i=1 
    while read LINE; do 
     if (($i > 4)); then break; fi 
     if (($i % 4 == 1)); then 
      if [[ $data =~ ^@SRR[0-9]{6}[[:blank:]] ]]; then 
       awk -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE ' {print $1,SUFFIX,"\n" } ' <<< $data 
       i=$(($i + 1)) 
      else 
       echo -e "error at line ${i}"; echo "${data}"; exit 1; fi 
     elif (($i % 4 == 2)); then echo -e "$LINE" 
      i=$(($i + 1)) 

     elif (($i % 4 == 3)); then 
      echo $data 
      awk -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE ' {print $1,SUFFIX,"\n" } ' <<< $data 
      i=$(($i + 1)) 

elif (($i % 4 == 0)); then echo -e "$LINE" 
    i=$(($i + 1)) 

else 
    echo -e "number of liness is not divisible by 4. Program Terminated.\nProblem encountered at line ${i}." 
    exit 1 
fi 

done < $INPUT_FILE 

내가 오류 메시지가 문자.

+0

당신은 정말 _exactly 하나'[: 빈] []을 찾으시는 것입니까? 아마도 당신은 그 뒤에'*'를 원할 것입니까? 아니면'.'과 일치하지 않는 문제입니까? – kojiro

+3

정규 표현식과 일치하지 않는 이유는'SRR [0-9] {6}'뒤에 공백이 아닌 ".2"가 있기 때문입니다. –

+0

''LINE'을 읽고'$ data'를 검사합니다. 복사 및 붙여 넣기 오류입니까, 아니면 진짜입니까? – rici

답변

0

(이 RICI의 코드로하지 우아하고 효율적인 있지만)를 작동 AWK 코드는 다음과 같습니다 :`character_

awk -v i=1 -v IFS=" " -v OFS="" -v ORS="" -v SUFFIX=$SUFFIX -v OUTPUT_FILE=$OUTPUT_FILE -v nchars=0 -v DIRECTION=$DIRECTION ' { 
     if (i%4==1 && $0~/^@SRR[0-9][0-9][0-9][0-9][0-9][0-9]\.[0-9]+\.$DIRECTION[[:blank:]][0-9]+[[:blank:]]length=100$/) 
      { printf "%s%s\n",$1,SUFFIX >> OUTPUT_FILE; i++ } 
     else if (i%4==2 && $0~/^[AGCTNagctn\-]+$/) 
      { nchars=length($0);printf "%s\n",$1 >> OUTPUT_FILE;i++ } 
     else if (i%4==3 && $0~/^\+SRR[0-9][0-9][0-9][0-9][0-9][0-9]\.[0-9]+[[:blank:]][0-9]+[[:blank:]]length=100$/) 
      { printf "%s%s\n",$1,SUFFIX >> OUTPUT_FILE; i++} 
     else if (i%4==0 && $0~/.*/ && nchars==length($0)) 
      { printf "%s\n",$1 >> OUTPUT_FILE;i++} 
     else 
      {printf "error at line %s:\n%s\n\n",i,$0; exit 1} 
     }' $INPUT_FILE