다음 텍스트 구조를 구문 분석하고 싶습니다.
>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 ]
p
Cluster
sed
답변4
grep "\*" file.txt |grep -E "(?<=>)[\w+\s\W]+"|sed 's/\.\.\.\*//'