Unix 명령을 사용하여 복잡한 텍스트 파일 구문 분석

Unix 명령을 사용하여 복잡한 텍스트 파일 구문 분석

다음 텍스트 구조를 구문 분석하고 싶습니다.

>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%
>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%

기본적으로 식별자는 *끝에 a로 표시되며, 그룹 크기는 마지막 그룹 번호 + 1이 됩니다.

내가 생성하고 싶은 결과는 다음과 같습니다(마지막에 있는 그룹 크기 참고).

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1      5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1      2

어떤 아이디어가 있나요?

답변1

다음은 다소 조잡한 것입니다(오류 처리 없음).

awk '/\*$/   { save_id = substr($3, 2, length($3)-4) }
    /^[0-9]/ { save_num = $1 }
    NR > 1 && /^>/ {print save_id, save_num+1 }
    END  {print save_id, save_num+1 }
    ' data_file
  • *(즉, match) 로 끝나는 줄에서는 첫 번째 문자( )와 마지막 세 문자( ) /*$/를 버리고 세 번째 단어에서 그룹 ID를 추출합니다 .>...
  • 숫자로 시작하는 줄에는 해당 숫자(즉, 첫 번째 단어)를 저장합니다.
  • 파일의 끝 으로 시작하거나 > (단, 를 지정하여 파일의 첫 번째 줄은 제외 ) 줄이 발생하면 해당하는 저장된 값을 출력합니다.NR > 1

답변2

perl  -F'\n' -lan00e 'print "$1\t$#F" if />(.*)\.{3} \*$/m'

답변3

sed '/^[>0-9]/h;s/.*>\(.*[0-9]\).*\*/[\1 ]P /p
     $s/.*//;/^[>0-9[]/d;g;s/ .*/ 1+pc/ 
' <<\DATA | dc
>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%

>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%
DATA

산출

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1 5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1 2

이것은 매우 간단합니다. 문자가 있는 모든 줄의 첫 번째 숫자 복사본을 유지합니다. *줄의 마지막 문자를 성공적으로 제거할 수 있거나 줄이 로 시작하지 않는 경우에만 인쇄 됩니다 >0-9. 마지막 줄의 모든 문자가 삭제됩니다. 따라서 빈 줄에 저장된 숫자를 추출하면 문자열과 각 문자열에 대한 작은 추가 작업을 dc얻게 됩니다 .[ stuff here ]pClustersed

답변4

 grep "\*" file.txt |grep -E "(?<=>)[\w+\s\W]+"|sed 's/\.\.\.\*//'

관련 정보