一連の文字列があります。これは「ノード」とマークされた小さな文字列で構成され、時には単独で、時には文字または:
接続で構成されます,
。
大きな文字列(「タイトル」)を「ノード」に分割したいです。
>
sedを使用していくつかの追加文字(、、、;
)を削除し、'
awkを使用して残りの文字列を分割し:
ます。,
問題は、最初のawk列だけでなく出力(「ノード」)を繰り返すことです。私は{print $0}
awkを使ってみましたが、区切り文字などを使って初期文字列を印刷します。
助けてください?
入力例(例ではforループによって処理され、より大きなコードではif / elseの出力です):
>NODE_3028138_length_2215_cov_1.9513_ID_6056275:NODE_6264558_length_375_cov_4.0000_ID_12529115';
>NODE_4338305_length_1150_cov_1.0000_ID_8676609;
>NODE_3552704_length_509_cov_1.0000_ID_7105407:NODE_4456634_length_439_cov_1.9597_ID_8913267',NODE_4457268_length_491_cov_0.9657_ID_8914535';
出力例(スタンドアロンなので、ノードNODE_4338305なし):
NODE_3028138_length_2215_cov_1.9513_ID_6056275
NODE_6264558_length_375_cov_4.0000_ID_12529115
NODE_3552704_length_509_cov_1.0000_ID_7105407
NODE_4456634_length_439_cov_1.9597_ID_8913267
NODE_4457268_length_491_cov_0.9657_ID_8914535
NODE_3028138_length_2215_cov_1.9513_ID_6056275
理想的には上記の各項目(、その後NODE_6264558_length_375_cov_4.0000_ID_12529115
など)を繰り返したいと思います。
for i in ">NODE_3028138_length_2215_cov_1.9513_ID_6056275:NODE_6264558_length_375_cov_4.0000_ID_12529115';" \
">NODE_4338305_length_1150_cov_1.0000_ID_8676609;" \
">NODE_3552704_length_509_cov_1.0000_ID_7105407:NODE_4456634_length_439_cov_1.9597_ID_8913267',NODE_4457268_length_491_cov_0.9657_ID_8914535';"
do
if [[ $i == *":"* ]];
then
echo $i
i=$(sed "s/[>;\']//g" <<< $i);
echo $i
echo $i | awk -F '[:,]' '{print $1}' | while IFS= read -r line; do echo "$line"; done
fi; done
オペレーティングシステム情報を追加するには編集してください。
- オペレーティングシステム:CentOS Linux 7(コア)
- カーネル: Linux 3.10.0-1127.el7.x86_64
- アーキテクチャ:x86-64
ベストアンサー1
どのステップも表示する必要はありません。私が正しく理解した場合は、次の形式のfastaファイルセットから始めます。
>header
sequence
>
ヘッダーを抽出してすべてのコンテンツを削除してから、またはに'
分割しようとしています。その場合は、fastaファイル自体で直接これを行うことができます。,
;
$ sed -n '/^>/{s/>//; s/[,:]/\n/gp}' *.fasta | tr -d "';"
NODE_3028138_length_2215_cov_1.9513_ID_6056275
NODE_6264558_length_375_cov_4.0000_ID_12529115
NODE_3552704_length_509_cov_1.0000_ID_7105407
NODE_4456634_length_439_cov_1.9597_ID_8913267
NODE_4457268_length_491_cov_0.9657_ID_8914535
説明する
sed -n
:明示的に指示しない限り、通常の出力を抑制し、何も印刷しません。/^>/{something}
:行が始まると>
実行しますsomething
。s/^>//;
>
:行の先頭から削除します。s/[,:]/\n/gp
g
:すべて(最後のためすべて),
または:
改行()を置き換えて印刷(\n
最後のために印刷します)。p
tr -d "';"
:;
またはいずれかを削除します'
。
あなたの意見では、試してみましたが、'i=$(sed "s/[:,]/\n/g" <<< $i)'
改行ではなく空白だけが得られたと言いました。その理由は、echo $i
代わりに実行してecho "$i"
改行文字が失われるからです。
表示された文字列コレクションを使用してこれを行う必要がある場合は、次のことができます。
for i in ">NODE_3028138_length_2215_cov_1.9513_ID_6056275:NODE_6264558_length_375_cov_4.0000_ID_12529115';" ">NODE_4338305_length_1150_cov_1.0000_ID_8676609;" ">NODE_3552704_length_509_cov_1.0000_ID_7105407:NODE_4456634_length_439_cov_1.9597_ID_8913267',NODE_4457268_length_491_cov_0.9657_ID_8914535';"; do
sed -n '/^>/{s/>//; s/[,:]/\n/gp}' <<<"$i" | tr -d "';" ;
done
NODE_3028138_length_2215_cov_1.9513_ID_6056275
NODE_6264558_length_375_cov_4.0000_ID_12529115
NODE_3552704_length_509_cov_1.0000_ID_7105407
NODE_4456634_length_439_cov_1.9597_ID_8913267
NODE_4457268_length_491_cov_0.9657_ID_8914535