2015-01-28 2 views
0

나는 아주 큰 텍스트 파일을 가지고 있으며, 단지 그것으로부터 특정 패턴을 추출하고 다른 .txt 파일로 저장할 필요가있다. ID, Name and Ontology_term :bash 명령은 텍스트 파일에서 여러 패턴을 추출하는 데 적합합니까?

"1","Dbxref=Entrez%7CGene:5008779;ID=GSPATG00000003001;Name=GSPATG00000003001;Ontology_term=GO:0005488" 
"2","Dbxref=Entrez%7CProtein:XP_001422966,EMBL:CAK55568,Uniprot:A0BAK1_PARTE,Entrez%7CProtein:124390026;Derived_from=GSPATT00000003001;ID=GSPATP00000003001;isoelectric_point=10.31;molecular_weight=55095.3;Name=GSPATP00000003001;Ontology_term=GO:0005488" 
"3","Alias=PTMB.459;Dbxref=Entrez%7CGene:5008781,Entrez%7CNucleotide:CR548612;ID=GSPATG00000005001;Name=GSPATG00000005001;Ontology_term=GO:0004185,GO:0006508" 
"4","Dbxref=Entrez%7CProtein:XP_001422968,Entrez%7CProtein:124390028,EMBL:CAK55570,Uniprot:Q6BFB1_PARTE;Derived_from=GSPATT00000005001;ID=GSPATP00000005001;isoelectric_point=6.41;molecular_weight=48434.5;Name=GSPATP00000005001;Ontology_term=GO:0004185,GO:0006508" 
"5","Alias=PTMB.456;Dbxref=Entrez%7CNucleotide:CR548612,Entrez%7CGene:5008770;ID=GSPATG00000009001;Name=GSPATG00000009001;Ontology_term=GO:0004672,GO:0004674,GO:0004713,GO:0005524,GO:0006468" 
"6","Dbxref=Entrez%7CProtein:XP_001422972,Entrez%7CProtein:124390032,EMBL:CAK55574,Uniprot:Q6BFB4_PARTE;Derived_from=GSPATT00000009001;ID=GSPATP00000009001;isoelectric_point=9.79;molecular_weight=73346.4;Name=GSPATP00000009001;Ontology_term=GO:0004672,GO:0004674,GO:0004713,GO:0005524,GO:0006468" 
"7","Dbxref=Entrez%7CGene:5008748;ID=GSPATG00000010001;Name=GSPATG00000010001;Ontology_term=GO:0005515,GO:0007154,GO:0035091" 

내가 필요한 것은, 난 그냥 모든 단어를 추출해야합니다 : 여기

내 텍스트 파일의 형식입니다. 예를 들어, 7 호선의 예상 출력은 다음과 같습니다

ID=GSPATG00000010001;Name=GSPATG00000010001;Ontology_term=GO:0005515,GO:0007154,GO:0035091" 

가 어떻게 리눅스 터미널에서 그것을 할 수 있습니까? sed를 통해

답변

3

,

$ sed 's/.*;\(ID[^;]*\).*;\(Name[^;]*\).*;\(Ontology_term[^;]*\).*/\1;\2;\3/' file 
ID=GSPATG00000003001;Name=GSPATG00000003001;Ontology_term=GO:0005488" 
ID=GSPATP00000003001;Name=GSPATP00000003001;Ontology_term=GO:0005488" 
ID=GSPATG00000005001;Name=GSPATG00000005001;Ontology_term=GO:0004185,GO:0006508" 
ID=GSPATP00000005001;Name=GSPATP00000005001;Ontology_term=GO:0004185,GO:0006508" 
ID=GSPATG00000009001;Name=GSPATG00000009001;Ontology_term=GO:0004672,GO:0004674,GO:0004713,GO:0005524,GO:0006468" 
ID=GSPATP00000009001;Name=GSPATP00000009001;Ontology_term=GO:0004672,GO:0004674,GO:0004713,GO:0005524,GO:0006468" 
ID=GSPATG00000010001;Name=GSPATG00000010001;Ontology_term=GO:0005515,GO:0007154,GO:0035091" 

[^;]*는 임의의 문자가 아닌 세미콜론의 0 번 이상 일치합니다. 기본 sed에서 캡처 그룹은 \(..\)으로 참조됩니다.

+0

감사합니다. 좋은 해결책 인 것 같습니다. Name 및 Ontology_term 다음에 오는 용어 만 남고 나머지는 모두 삭제되도록이 명령을 어떻게 변경할 수 있습니까? 예 : 마지막 줄 : GSPATG00000010001, GO : 0005515, GO : 0007154, GO : 0035091 " – Robin

+1

이 sed의 시도 /.*; Name = \ ([^;] * \). *; Ontology_term = \ ([^;] * \). */\ 1; \ 2/'file'. [이 대답이 작동하는 경우 수락] (http://stackoverflow.com/help/accepted-answer). –

1

입력 형식은 쉼표로 구분 된 큰 따옴표 안에 세미콜론으로 구분 된 입력란이 들어 있습니다. 첫 번째 세미콜론 앞에있는 첫 번째 필드가 항상 흥미롭지 않고 마지막 필드도 항상 버려야한다는 것을 확신 할 수 있다면 간단히 세미콜론으로 분할하고 원하는 필드를 추출하여 속일 수 있습니다.

awk -F ';' '{ for (i=1; i<=NF; ++i) { sub(/"$/, "", $i); 
    if ($i ~ /^(ID|Name|Ontology_term)=/) printf "%s", $i; printf "\n" } }' file 

이러한 가정은 항상지지 않은 경우 그들이 할 수 있도록, 어쩌면 당신은 마사지 또는 입력 전처리 수 있습니다. 실제로, 나는 어떤 마지막 큰 따옴표를 다듬어서 이것을한다. 궁극적으로 입력을 파싱하고 잘 정의 된 쉼표 또는 세미콜론으로 구분 된 형식 (또는 선택 필드 나 중첩 구조가 많은 경우 JSON)으로 변환하면 가장 강력하고 유익한 솔루션이 될 수 있습니다.

관련 문제