dnaファイルをインポートし、改行文字や空白文字がないことを確認してから、固有のコドンとその発生回数を出力するbashスクリプトを作成したいと思います。次のコードを使用しましたが、codonは引き続き「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
答え1
スクリプトの最初の行が新しいbash
シェルを起動するので、対応する出力を取得します。
この行は読む必要があります
#!/bin/bash
(#
始めに注意してください)。
次に、awk
決して機能しない方法で構文とシェルコードを混在させます。
代わりに、単純に保ち、ファイルを3つの文字グループに分けて並べ替え、取得できる一意の文字数を数えます。
$ fold -w 3 dnafile | sort | uniq -c
3 aac
2 acg
1 ttt
このアプローチは、入力が常に3文字の倍数を含み、埋め込まれたスペースや他の文字がない限り機能します。
答え2
(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
}'
答え3
やや冗長な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*
この入力の場合
ファイル1:確認
aacacgaactttaacacg
ファイル2:スペース
aacacgaact ttaacacg
ファイル3:改行文字
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 ")