私は偶然会ったこの行 スクリプト固定幅のテキストファイルから改行を削除するために使用されます。アイデアは、次の項目でいっぱいのファイルを変更することです。
>IGHV1-18*01
CAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAG
GTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTATGGTATCAGC
TGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTAC
AATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACA
GACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCC
GTGTATTACTGTGCGAGAGA
到着
>IGHV1-18*01
CAGGTTCAGCTGGTGCAGTCTGGAGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAGGCTTCTGGTTACACCTTTACCAGCTATGGTATCAGCTGGGTGCGACAGGCCCCTGGACAAGGGCTTGAGTGGATGGGATGGATCAGCGCTTACAATGGTAACACAAACTATGCACAGAAGCTCCAGGGCAGAGTCACCATGACCACAGACACATCCACGAGCACAGCCTACATGGAGCTGAGGAGCCTGAGATCTGACGACACGGCCGTGTATTACTGTGCGAGAGA
私はAWKの経験があまりないので、これを試して解釈するのが良い学習経験になると思いました。しかし、私は困難に直面しました。具体的には、複数のブロックが順番に発生する場合、最初のブロックは暗黙的なforループですか?
awk '/^>/ {printf("\n%s\n",$0);next; } { printf("%s",$0);} END {printf("\n");}' < file.fa
ベストアンサー1
そうですね。ちょうどそれは暗黙的ではありません。実際、フォーマットは次のようになります。
/foo/{something}
どちらが同じですか?
if(/foo/){something}
つまり、現在の行が一致する場合foo
(あなたの例では一致する場合>
)、改行、現在の行、および他の改行を印刷します。
next
最初のブロックが実行されたら、スクリプトが残りのブロックをスキップして次の行に移動することを確認してください。 onelinerは次のように書くこともできます。
awk '{
if(/^>/){
printf("\n%s\n",$0);
}
else{
printf("%s",$0);
}
END {
printf("\n");
}' < file.fa
最後に、単純なprint
呼び出しがawk
改行を追加するので、上記の少し簡単なバージョンを使用できます。
awk '/^>/{print "\n"$0;next;}{printf("%s",$0);} END{print}' file.fa