DNA配列のスコアを付けたいです。
A = 1 T = 2 C = 3 G = 4
私の入力は
ATGGCGATTGA
AGCTTAGCCAG
AGCTTAGGGAA
私の出力は
seq_number 1 has score = 28
seq_number 2 has score = 28
seq_number 3 has score = 27
編集した私の入力は.txtファイルです。
ベストアンサー1
sed -e 's/A/./g' -e 's/T/../g' \
-e 's/C/.../g' -e 's/G/..../g' file |
awk '{ printf("seq_number %d has score = %d\n", NR, length) }'
出力:
seq_number 1 has score = 28
seq_number 2 has score = 28
seq_number 3 has score = 27
このsed
コマンドは、各ベースをスコアを表す複数のポイントに置き換えます。このawk
コマンドは、これまでに読み取った行数を印刷し、行の総スコアである行の長さを計算します。
最初のsed
表現はs/A/./g
実際に正確である必要はありません。
バリエーション(面白いと少し短い):
sed -e 's/G/TT/g;s/C/TA/g;s/T/AA/g' file |
awk '{ printf("seq_number %d has score = %d\n", NR, length) }'
1行に1つずつ分数のみを提供するバリアント:
tr 'ATCG' '1234' <file | awk -F'\0' -vOFS="+" '$1=$1' | bc
まず、各文字をその文字の小数に置き換えてから、を使用してawk
各数字の間に挿入します。+
次に、各行の総点計算を処理しますbc
。
最後に、最後のもののバリアントですが、合計のみが含まれますsed
(bc
再び分数のみが印刷されます)。
sed 'y/ATCG/1234/;s/\(.\)/+\1/g;s/^+//' file | bc
サンディップが提案した
sed 'y/ATCG/1234/;s/./+&/2g' file | bc
これは私の最後のものの短い変形です。
まず、コマンドを使用して文字をその数に変更し、y
各文字(2番目の文字から始まる)を前の文字自体に置き換えて、入力文字列の+
出力を ACCA
取得します。その後、この算術式を評価するために使用されます。1+3+3+1
bc
sed
彼のソリューションは、標準がsed
getとas replacementフラグの両方を好まないため、GNUでのみ機能します2
。g