検索しましたが、私の問題の解決策が見つかりませんでした。次の文字A
、T
および(DNA配列を表す)文字列をC
含むファイルがあります。G
$ cat species_gene
>genus_1_species_1
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
>tribe_1_species_1
CTGGATATAGAGTTGCACACATACGATCTGGGAATGGAAAACCGCGACAAGACTGATGACCAAGTCACAATCGATTGCGC
CAACGCGATTAAAAAATACAACGTTGGAATTAAGTGCGCGACCATCACTCCCGACGAGAAGAGAGTCGAGGAATTCAAGC
>species_2
CTTGATATTGAACTACACACCTATGATTTGGGAATGGAATACCGCGATAAAACTGATGACCAAGTCACAATTGACTGCGC
KAATGCTATTAAGAAATACAATGTTGGTATTAAGTGCGCTACCATAACTCCAGATGAAAAAAGAGTTGAAGAATTCAAAC
>genus_1_species_1
タイトルの後の文字列から次のタイトルまでの文字数を数えたいです。この例では、次の文字列の長さは160に等しくなります。
TTGGATATTGAGTTACATACATATGATTTGGGAATGGAGAACCGAGATAAGACTGAAGATCAAGTCACAATTGATTGTGC
TAATGCTGTCAAGAAATACAATGTCGGCATCAAATGTGCAACTATTACTCCTGATGAAAATCGAGTTGAGGAGTTCAAGC
>
awkを使用し、レコード区切り文字と改行文字をフィールド区切り文字として使用し、レコードの2行目から始まるフィールド(つまり行)の数を計算したいと思います。次のコマンドを使用しました。
$ awk 'BEGIN {RS=">"} NR==2 {print length}' species_gene
180(最初のレコードの文字数)を取得しました。私が得たい出力は160(2行目から始まる最初のレコードの長さ)です。ヘッダーを削除するには、次のいずれかの方法を試しました。
$ awk 'BEGIN {RS=">"; FS="\n"} NR==2 {if (NF!=1) {length}}' species_gene
誰かが私を助けることができれば嬉しいです。
ベストアンサー1
IMHO 空行をレコード区切り文字として使用する方が自然です。この「段落モード」では、awkにはフィールド区切り文字の改行が含まれているため、レコードの各行はフィールドになります。その後、空の文字列を割り当てて最初のフィールドを削除できます。これは、指定された出力フィールド区切り文字を使用してレコード全体を再評価する良い副作用があります。これを空の文字列に設定すると、残りのフィールドがリンクされます。その後、レコード長を簡単に印刷できます。
awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
与えられた入力を使ってテスト
$ awk 'BEGIN {RS="";OFS=""} NR==1 {$1=""; print length}' species_gene
160