예를 들어 다음과 같이 많은 열이 포함된 파일이 있습니다.
ID1 XP_026389348.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Papaver_somniferum]
ID2 XP_026389348.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Papaver_somniferum]
ID3 XP_026389348.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Papaver_somniferum]
ID4 XP_026389348.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Papaver_somniferum]
ID5 XP_026389348.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Papaver_somniferum]
ID6 XP_022013305.1_60S_ribosomal_protein_L36-2-like_[Helianthus_annuus]
ID7 XP_022033863.1_60S_ribosomal_protein_L36-2-like_[Helianthus_annuus]
ID8 XP_022033864.1_60S_ribosomal_protein_L36-2-like_[Helianthus_annuus]
ID9 XP_022033865.1_60S_ribosomal_protein_L36-2-like_[Helianthus_annuus]
ID10 NP_850400.1_Plant_stearoyl-acyl-carrier-protein_desaturase_family_protein_[Arabidopsis_thaliana]
ID11 XP_015383392.1_60S_ribosomal_protein_L36-3-like_[Citrus_sinensis]
ID12 XP_015383392.1_60S_ribosomal_protein_L36-3-like_[Citrus_sinensis]
ID13 XP_019051818.1_PREDICTED:_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_isoform_X2_[Nelumbo_nucifera]
ID14 XP_019051818.1_PREDICTED:_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_isoform_X2_[Nelumbo_nucifera]
ID15 XP_019051818.1_PREDICTED:_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_isoform_X2_[Nelumbo_nucifera]
ID16 XP_021982111.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Helianthus_annuus]
ID17 NP_001150213.1_uncharacterized_protein_LOC100283843_[Zea_mays]
ID18 XP_027164486.1_stearoyl-[acyl-carrier-protein]_9-desaturase,_chloroplastic_[Coffea_eugenioides]
ID19 XP_009419937.1_PREDICTED:_60S_ribosomal_protein_L36-3-like_[Musa_acuminata]
ID20 XP_020267482.1_60S_ribosomal_protein_L36-2-like_[Asparagus_officinalis]
[ ]의 두 번째 열에서 유기체 이름을 추출하고 해당 ID로 개수를 계산하고 싶습니다. 예를 들면 다음과 같습니다.
5 Papaver somniferum ID1
ID2
ID3
ID4
ID5
4 Helianthus annuus ID6
ID7
ID8
ID9
1 Arabidopsis thaliana ID10
2 Citrus sinensis ID11
ID12
3 Nelumbo nucifera ID13
ID14
ID15
1 Helianthus annuus ID16
1 Zea mays ID17
1 Coffea eugenioides ID18
1 Musa acuminata ID19
1 Asparagus officinalis ID20
나는 몇 가지를 시도했습니다:
cat file | cut -f2 | rev |awk -F "[" '{gsub("]", "");print $1 | "rev"}' | sed '/#/d' | sort |uniq -c| sort -nr
출력은 다음과 같습니다.
5 Papaver somniferum
4 Helianthus annuus
1 Arabidopsis thaliana
2 Citrus sinensis
3 Nelumbo nucifera
1 Helianthus annuus
1 Zea mays
1 Coffea eugenioides
1 Musa acuminata
1 Asparagus officinalis
감사해요.
답변1
$ datamash -t' ' -g2 count 1 collapse 1 < <(sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file) \
| awk '{ print $2,$1,$3 }' \
| sed 's/,\(ID[^,]*\)/\n# # \1/g' \
| column -t \
| tr '#' ' '
5 Papaver_somniferum ID1
ID2
ID3
ID4
ID5
4 Helianthus_annuus ID6
ID7
ID8
ID9
1 Arabidopsis_thaliana ID10
2 Citrus_sinensis ID11
ID12
3 Nelumbo_nucifera ID13
ID14
ID15
1 Helianthus_annuus ID16
1 Zea_mays ID17
1 Coffea_eugenioides ID18
1 Musa_acuminata ID19
1 Asparagus_officinalis ID20
1 단계: 다음을 사용하여 ID와 유기체 이름을 추출합니다 sed
.
$ sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file
ID1 Papaver_somniferum
ID2 Papaver_somniferum
ID3 Papaver_somniferum
ID4 Papaver_somniferum
ID5 Papaver_somniferum
ID6 Helianthus_annuus
ID7 Helianthus_annuus
...
2 단계: sed
출력을 GNU에 공급 datamash
하고 두 번째 필드에서 그룹화하고 첫 번째 필드에서 계산한 후 축소합니다.
$ datamash -t' ' -g2 count 1 collapse 1 < <(sed 's/^\(ID[0-9]*\).*\[\([^]]*\)\]$/\1 \2/' file)
Papaver_somniferum 5 ID1,ID2,ID3,ID4,ID5
Helianthus_annuus 4 ID6,ID7,ID8,ID9
Arabidopsis_thaliana 1 ID10
Citrus_sinensis 2 ID11,ID12
Nelumbo_nucifera 3 ID13,ID14,ID15
Helianthus_annuus 1 ID16
Zea_mays 1 ID17
Coffea_eugenioides 1 ID18
Musa_acuminata 1 ID19
Asparagus_officinalis 1 ID20
3단계:출력을 표 형식으로 변환하려면 몇 가지 형식을 추가하세요.
awk '{ print $2,$1,$3 }'
열 2(개수)와 열 1(생물명)을 바꿉니다.sed 's/,\(ID[^,]*\)/\n# # \1/g'
각 쉼표와 ID를 줄 바꿈, 공백으로 구분된 두 개의 더미 문자#
및 ID( GNU 사용sed
) 로 바꿉니다.column -t
표로 형식 지정tr '#' ' '
#
더미 문자를 공백으로 바꾸기
답변2
awk
GNU 및 GNU 사용 column
:
awk -F'[][ ]*' '{print ($(NF-1)==n?OFS:$(NF-1)),$1; n=$(NF-1)}' OFS=, file \
| awk -F, -v OFS=, 'NF==3{line=line RS $0;i++} NF==2{if(line)print i,line; line=$0; i=1}' \
| column -t -n -s,
첫 번째 awk 명령은 다음 형식으로 필수 필드를 추출하고 표시합니다.
Papaver_somniferum,ID1
,,ID2
,,ID3
...
두 번째 awk 명령은 동일한 이름을 가진 모든 필드로 구성된 새 줄을 작성하고 그 수를 앞에 추가합니다.
마지막으로, 컬럼 명령은 옵션을 사용하여 3개 열에 결과를 표시합니다 -n
.
5 Papaver_somniferum ID1
ID2
ID3
ID4
ID5
4 Helianthus_annuus ID6
ID7
...