AWKでは、複数のブロックがどのように機能しますか?

AWKでは、複数のブロックがどのように機能しますか?

私は偶然会ったこの行 スクリプト固定幅のテキストファイルから改行を削除するために使用されます。アイデアは、次の項目でいっぱいのファイルを変更することです。

>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

おすすめ記事