아래 예와 같이 DNA 서열이 포함된 파일이 있습니다. 각각의 A, T, G, C 개수를 어떻게 찾을 수 있나요?기둥(예, 행이 아니라 열) bash 쉘 명령을 사용합니다.
파일에는 846975줄이 있으며 다음과 같습니다.
AAGAAAGAAGAGGAACTTCTCTCCATCCAGCCTCATTCCACTGCACCAACTCTTCTGTGT
CGGGTTGTGCAGGAGAGAAAGGGAGCTTGGCAACTCTTTGCTGTGCTGAGTTGTGGTAGC
CCATCACTGGGTTGTAAAGTGCCTTGCCTCCTTTCCTCCCCTCCTTTTTTTTTGAGACAG
AGTCTCACTCTGTCGTCCAGGCTGAGGTGCAGTGGTGCGATCTCTGCTCACTGCAACCTC
AGCCTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCAGGAAGCTGGGACTACAGGC
ACATGCCACCACACCTGGCTAACTTTTTTTTATTTTTAGTAGAGAAAGGGTATCACCATG
TTGGCCAGGCTGGTCTTGAACTCCTGACTTCAGGTGATCCACCCACCTTGGCCCCCCAAA
GTGCTGGGGTTAAAGGCATGAGACACTGCGCCCGTCCACCTCCTCTTTTACTTGGGAGAA
ATGCACAGATTCTGGGTGCCATGTGCATTTGTTTTGGGAGTGATAATTGATCTAACTTAT
GGAAATAATACTAGATAGTTAGCGGATGGATTCTGTATCTGATGAGAGTTTTGGGCAAAA
CGAATTCCTAGTTTCTGAGTCTTATTTTTCCCCTGATTCAAGAAAACTGTGAATTATCCA
GCCAGTAAAAAACTCTCACAGCTCTGGATGTGAGTTTAGGACACTGGATTTCTACCACTC
ATTTTCTTACTACTTTTCCTGTGCAAGGATCATGGCACAAGTTGCAGTTTCCACCCTGCC
CATTGAAGATGAGGAGTCTGTTGAAGATGAGGAGTCCTTGGAGAGCAGGATGGTGGTGAC
ATTCCTGTCAGCTCTCGCCTCCATGGTCAGACCTTCTGTTCTCACATTCTGTAGTTCGGT
AGGACTGGGCGGTAGATAAGGTTGATTTGTTTTCGTAGAACTTACAATTTTGTGATTTTT
AGTTCTAATGAGTAGACCTTTTTCGTGAATAGTAGTTACGATCAAACACCTCTGACCAAA
이 예의 경우 첫 번째 열의 출력은 이어야 합니다 A=9,T=1,G=3,C=4
.
답변1
일반적으로 awk
null/null 필드 구분 기호(특정 gawk
)를 지원하는 경우 다음과 같은 작업을 수행할 수 있습니다(행당 개수를 원하는 경우).
gawk -F '' '{for (x=1;x<=NF;x++) arr[NR$x]++;
for (i in arr) printf("%s:%d\t", i, arr[i]);delete arr;print ""}' infile
아니요, 열당 개수가 정말로 필요한 경우(필드 구분 기호가 비어 있다고 가정), 먼저 입력 데이터를 열에서 행으로 변환한 다음 위와 동일한 작업을 수행해야 합니다.
gawk -F '' '{for (x=1;x<=NF;x++) arr[NR$x]++;
for (i in arr) printf("%s:%d\t", i, arr[i]);delete arr;print ""}' \
<(gawk -F '' '{for (i=1;i<=NF;i++) ctr[i]=ctr[i]$i}
END{for (i in ctr) print ctr[i]}' infile)
아래 스크립트를 사용하여 awk
열을 행으로 바꿉니다.
gawk -F '' '{for (i=1;i<=NF;i++) ctr[i]=ctr[i]$i}
END{for (i in ctr) print ctr[i]}' infile
위의 명령 대신 다음 명령을 사용하여 조옮김할 수 있습니다.
sed 's/./& /g' in|datamash -t ' ' transpose |sed 's/ //g'
답변2
내 생각엔 당신이 말하는 것 같아요각각의 A, T, G, C의 개수를 구하세요.열.
암소 비슷한 일종의 영양앗해결책:
awk -v FPAT="[A-Z]" '{
printf "A: %s, T: %s, G: %s, C: %s\n",
gsub("A",""),gsub("T",""),gsub("G",""),gsub("C","")
}' file
산출:
A: 17, T: 15, G: 9, C: 19
A: 11, T: 16, G: 24, C: 9
A: 8, T: 23, G: 10, C: 19
A: 9, T: 16, G: 16, C: 19
A: 11, T: 13, G: 16, C: 20
A: 17, T: 20, G: 10, C: 13
A: 11, T: 14, G: 13, C: 22
A: 12, T: 15, G: 17, C: 16
A: 14, T: 23, G: 15, C: 8
A: 20, T: 18, G: 17, C: 5
A: 16, T: 23, G: 8, C: 13
A: 17, T: 16, G: 12, C: 15
A: 12, T: 21, G: 10, C: 17
A: 16, T: 14, G: 24, C: 6
A: 8, T: 22, G: 11, C: 19
A: 14, T: 25, G: 16, C: 5
A: 20, T: 18, G: 10, C: 12
답변3
나는 사용자가 각 행의 염기 수를 계산하기를 원한다고 가정합니다.
펄 사용:
$ perl -ne 'chomp; printf("%s\t%2d %2d %2d %2d\n", $_, tr/A/A/, tr/C/C/, tr/G/G/, tr/T/T/)' file
AAGAAAGAAGAGGAACTTCTCTCCATCCAGCCTCATTCCACTGCACCAACTCTTCTGTGT 17 19 9 15
CGGGTTGTGCAGGAGAGAAAGGGAGCTTGGCAACTCTTTGCTGTGCTGAGTTGTGGTAGC 11 9 24 16
CCATCACTGGGTTGTAAAGTGCCTTGCCTCCTTTCCTCCCCTCCTTTTTTTTTGAGACAG 8 19 10 23
AGTCTCACTCTGTCGTCCAGGCTGAGGTGCAGTGGTGCGATCTCTGCTCACTGCAACCTC 9 19 16 16
AGCCTCCTGGGTTCAAGTGATTCTCCTGCCTCAGCCTCCCAGGAAGCTGGGACTACAGGC 11 20 16 13
ACATGCCACCACACCTGGCTAACTTTTTTTTATTTTTAGTAGAGAAAGGGTATCACCATG 17 13 10 20
TTGGCCAGGCTGGTCTTGAACTCCTGACTTCAGGTGATCCACCCACCTTGGCCCCCCAAA 11 22 13 14
GTGCTGGGGTTAAAGGCATGAGACACTGCGCCCGTCCACCTCCTCTTTTACTTGGGAGAA 12 16 17 15
ATGCACAGATTCTGGGTGCCATGTGCATTTGTTTTGGGAGTGATAATTGATCTAACTTAT 14 8 15 23
GGAAATAATACTAGATAGTTAGCGGATGGATTCTGTATCTGATGAGAGTTTTGGGCAAAA 20 5 17 18
CGAATTCCTAGTTTCTGAGTCTTATTTTTCCCCTGATTCAAGAAAACTGTGAATTATCCA 16 13 8 23
GCCAGTAAAAAACTCTCACAGCTCTGGATGTGAGTTTAGGACACTGGATTTCTACCACTC 17 15 12 16
ATTTTCTTACTACTTTTCCTGTGCAAGGATCATGGCACAAGTTGCAGTTTCCACCCTGCC 12 17 10 21
CATTGAAGATGAGGAGTCTGTTGAAGATGAGGAGTCCTTGGAGAGCAGGATGGTGGTGAC 16 6 24 14
ATTCCTGTCAGCTCTCGCCTCCATGGTCAGACCTTCTGTTCTCACATTCTGTAGTTCGGT 8 19 11 22
AGGACTGGGCGGTAGATAAGGTTGATTTGTTTTCGTAGAACTTACAATTTTGTGATTTTT 14 5 16 25
AGTTCTAATGAGTAGACCTTTTTCGTGAATAGTAGTTACGATCAAACACCTCTGACCAAA 20 12 10 18
또는
$ perl -ne 'BEGIN { print(" A C G T\n") } printf("%2d %2d %2d %2d\n", tr/A/A/, tr/C/C/, tr/G/G/, tr/T/T/)' file
A C G T
17 19 9 15
11 9 24 16
8 19 10 23
9 19 16 16
11 20 16 13
17 13 10 20
11 22 13 14
12 16 17 15
14 8 15 23
20 5 17 18
16 13 8 23
17 15 12 16
12 17 10 21
16 6 24 14
8 19 11 22
14 5 16 25
20 12 10 18
tr
Perl의 연산자는 쉘의 유틸리티와 마찬가지로 음역됩니다 . tr
음역된 문자 수를 반환합니다.