以下の例に示すように、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
) をサポートしている場合は、次のことができます (1 行あたりの数が必要な場合)。
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'