다음과 같은 파일이 있습니다.
입력 파일:
Evigen1000005_c0_g1_i1 0.240 1.212 1.408 3.784 2.029 0.963 -1.22409810298695 1 NA NA NA NA PF04597.13;Ribophorin_I;4.6e-148 NA 1;21;0.875 len=569;ExpAA=32.49;First60=12.82;PredHel=1;Topology=o433-450i Q9SFX3 OST1A_ARATH reviewed Dolichyl-diphosphooligosaccharide--protein_glycosyltransferase_subunit_1A_(EC_2.4.99.18)_(Ribophorin_IA)_(RPN-IA)_(Ribophorin-1A) OST1A_RPN1A_At1g76400_F15M4.10 Arabidopsis_thaliana_(Mouse-ear_cress) 614 protein_N-linked_glycosylation_via_asparagine_[GO:0018279] endoplasmic_reticulum_[GO:0005783];_integral_component_of_membrane_[GO:0016021];_membrane_[GO:0016020];_oligosaccharyltransferase_complex_[GO:0008250] dolichyl-diphosphooligosaccharide-protein_glycotransferase_activity_[GO:0004579] 3702.AT1G76400.1; PF04597; IPR007676; 3702 ath:AT1G76400; F15M4.10 2.4.99.18 SUBCELLULAR_LOCATION:_Endoplasmic_reticulum_membrane_{ECO:0000250};_Single-pass_type_I_membrane_protein_{ECO:0000250}. SIGNAL_1_25_{ECO:0000255}. AT1G76400.1; NA NA NA NA NA NA NA NA NA NA NA
Evigen1000006_c0_g1_i1 0.358 0.179 0.000 0.424 0.139 0.183 NA NA NA NA NA NA PF07767.10;Nop53_(60S_ribosomal_biogenesis);5.2e-21 NA 1;31;0.588 len=170;ExpAA=14.33;First60=14.27;PredHel=0;Topology=o O22892 NOP53_ARATH reviewed Ribosome_biogenesis_protein_NOP53 At2g40430_T2P4.22 Arabidopsis_thaliana_(Mouse-ear_cress) 442 ribosomal_large_subunit_assembly_[GO:0000027];_ribosomal_large_subunit_export_from_nucleus_[GO:0000055] nucleolus_[GO:0005730];_nucleoplasm_[GO:0005654] rRNA_binding_[GO:0019843] 3702.AT2G40430.2; PF07767; IPR011687; 3702 ath:AT2G40430; T2P4.22 SUBCELLULAR_LOCATION:_Nucleus,_nucleolus_{ECO:0000250|UniProtKB:Q9NZM5}._Nucleus,_nucleoplasm_{ECO:0000250|UniProtKB:Q9NZM5}. AT2G40430.1_[O22892-1]; NA NA NA NA NA NA NA NA NA NA NA NA NA
괄호 안에서만 "GO:"로 시작하는 텍스트를 꺼내고 싶습니다. 각 GO 뒤에는 7자리 숫자가 있습니다. 예를 들어 "GO:0018279"입니다. GO 용어입니다. 각 행의 GO 용어 수가 동일하지 않습니다. 출력은 첫 번째 열에 Untranscript ID(예: Evigen1000005_c0_g1_i1)와 나머지 GO 용어가 포함된 파일이어야 합니다. 다음과 같은 출력 파일을 원합니다.
결과물 파일:
Evigen1000005_c0_g1_i1 GO:0018279 GO:0005783 GO:0016021 GO:0016020 GO:0008250 GO:0004579
Evigen1000006_c0_g1_i1 GO:0000027 GO:0000055 GO:0005730 GO:0005654 GO:0019843
답변1
script
최종 사양을 충족하는 것이 좋습니다 .
#!/bin/bash
while read line
do
# echo "$line"
name=${line%% *}
echo -n "$name "
data=$(<<< "$line" grep -o '\[GO:.\{7\}\]' | tr '\n' ' ' | sed -e 's/\[//g' -e 's/\]//g')
echo "$data"
done < "$1"
시험:
$ ./script input
Evigen1000005_c0_g1_i1 GO:0018279 GO:0005783 GO:0016021 GO:0016020 GO:0008250 GO:0004579
Evigen1000006_c0_g1_i1 GO:0000027 GO:0000055 GO:0005730 GO:0005654 GO:0019843
답변2
어때요?
sed -r 's/(^[^[:space:]]* )[^[]*\[/\1/; s/\][^[]*(\[|$)/ /g' file
Evigen1000005_c0_g1_i1 GO:0018279 GO:0005783 GO:0016021 GO:0016020 GO:0008250 GO:0004579
Evigen1000006_c0_g1_i1 GO:0000027 GO:0000055 GO:0005730 GO:0005654 GO:0019843 O22892-1
원하는 출력이 처리된 입력 샘플을 반영하지 않습니다.
편집하다:심지어
sed -r 's/((^[^ ]* )|\])[^[]*(\[|$)/\2 /g' file
편집하다:원하는 결과로 질문을 세 번 수정하고 시도해 보세요.
sed -r 's/((^[^ ]* )|\])[^[]*(\[GO)/\2 GO/g; s/\].*$//' file
답변3
sed에서 더 빠릅니다:
start='\[GO:' end='\]'
sed -e 's,'"$start"$',\1,g' -e 's,'"$end"$',\2,g' \
-e $'s, [^\1]*, ,' -e $'s,\1\\([^\2]*\\)\2[^\1]*,GO:\\1 ,g' \
infile
또는 이상한:
awk -vone=$'\1' -vtwo=$'\3' -vstart='\[GO:' -v end='\]' '
{
printf("%s ",$1);
gsub(start,one);
gsub(end,two);
sub("^[^"one"]*"one,"GO:")
gsub(two"[^"one"]*"one," GO:")
sub(two".*$" ,"")
}
1' infile