Dnaファイルを取り込んで、改行文字や空白文字がないことを確認し、一意のコドンとそれらが発生した回数を出力するbashスクリプトを作成したいと思います。次のコードを使用しましたが、コドンは "bash-3.2 $"の出力を繰り返し出します。構文が間違っているかどうか、また適切な出力が得られない理由について、私はとても混乱しています。
! /bin/bash
for (( pos=1; pos < length - 1; ++pos )); do
codon = substr($1, $pos, 3)
tr-d '\n' $1 | awk -f '{print $codon}' | sort | uniq -c
done
たとえば、dnafileという名前のファイルにパターンaacacgaactttaacacgが含まれている場合、スクリプトは次の入力と出力を受け取ります
$script dnafile
aac 3
acg 2
ttt 1
スクリプトの最初の行が新しいbash
Shellを開始するため、その出力が得られます。
その行は読むべきです
#!/bin/bash
(#
開始時)。
次に、awk
構文をシェルコードと組み合わせて、機能しないようにします。
代わりに、それをシンプルに保ち、ファイルを3つの文字のグループに切り分け、これらを並べ替えて、取得した一意の文字の数を数えます。
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
これは、入力に常に3文字の倍数が含まれ、スペースや他の文字が埋め込まれていない限り機能します。
(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
Perl -ne '# Split input into triplets (A3)
# use each triplet as key in the hash table count
# and increase the value for the key
map { $count{$_}++ } unpack("(A3)*",$_);
# When we are at the end of the file
END{
# Remove the key "" (which is wrong)
delete $count{""};
# For each key: Print key, count
print map { "$_ $count{$_}\n" } keys %count
}'
少し長いawk
バージョン
awk 'BEGINFILE{print FILENAME; delete codon}
ENDFILE {
if (NR!=1 || NF!=1 || length($0)%3!=0){
print "is broken"}
else{
for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++};
for (c in codon) print c, codon[c];
print ""}' file*
この入力について
file1:OK
aacacgaactttaacacg
file2:スペース
aacacgaact ttaacacg
file3:改行
aacacgaact
ttaacacg
file4:3の倍数ではない
aacacgaactttaacac
あなたが得る
file1
aac 3
ttt 1
acg 2
file2
is broken
file3
is broken
file4
is broken
ファイルを修復したいだけでfile4
次にcat
ファイルをtr
からawk
の一端から、または他の端から、例のように
<<< $(cat file[1..3] | tr -d "\n ")