awk - レコードの最初の行をスキップします。

awk - レコードの最初の行をスキップします。

検索しましたが、私の問題の解決策が見つかりませんでした。次の文字ATおよび(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

答え2

lengthawkでは変数だけでなく関数でもあります。

$ awk 'BEGIN {RS=">"} NR==2 {print length($2) + length($3)}' species_gene
160

それがすべてです。完全なレコード長を使用する代わりに、両方のフィールドの長さを追加するだけです。

短く:

$ awk 'BEGIN {RS=">"} NR==2 {print length($2 $3)}' species_gene
160

また長い:

$ awk 'BEGIN {RS=">"} NR==2 && $0 = length($2 $3)' species_gene
160

答え3

可能なマイナーな改善あなたの進捗状況到着スチールドライバーの回答:

awk -vRS=">" -vOFS="" '$1=="genus_1_species_1" {$1=""; print length;}' species_gene

はと-vRS=">"同じで、BEGIN {RS=">"}と同じように関連しています-vOFS=""。私の貢献は、このバージョンではレコードのヘッダーと長さを指定できるため、レコードを計算する必要がないことです。

関連情報