awkを使用して次の行をカンマで区切って最初の行の終わりにインポートするにはどうすればよいですか?

awkを使用して次の行をカンマで区切って最初の行の終わりにインポートするにはどうすればよいですか?

公に利用可能なデータベースから.faいくつかのフォーマットのシーケンスをダウンロードしました。.csvシーケンス名と長さをカンマで区切って含むファイルを作成したいと思います。入力ファイルは次のとおりです。

>cel-let-7-5p MIMAT0000001 Caenorhabditis elegans let-7-5p
UGAGGUAGUAGGUUGUAUAGUU
>cel-let-7-3p MIMAT0015091 Caenorhabditis elegans let-7-3p
CUAUGCAAUUUUCUACCUUACC
>cel-lin-4-5p MIMAT0000002 Caenorhabditis elegans lin-4-5p
UCCCUGAGACCUCAAGUGUGA
>cel-lin-4-3p MIMAT0015092 Caenorhabditis elegans lin-4-3p
ACACCUGGGCUCUCCGGGUACC
>cel-miR-1-5p MIMAT0020301 Caenorhabditis elegans miR-1-5p
CAUACUUCCUUACAUGCCCAUA

ヘッダー行の最初の項目を選択して次の行の読み取りサイズを印刷するには、次のコマンドを使用します。

grep -A 1 "^>" file_name.fa | awk '{print($1); getline; print length($0)}'

これが私が得たものです。出力:

>cel-let-7-5p
22
>cel-let-7-3p
22
>cel-lin-4-5p
21
>cel-lin-4-3p
22
>cel-miR-1-5p
22

.csvしかし、必要な出力ではExcel / R / pythonにエクスポートできるファイルを作成したいと思います。予想出力:

cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

私ができる方法はありますか?オンラインでヘルプが見つかりません。

答え1

そして使用を避けるgetline()必ずしも必要ではない場合):

$ awk '
    /^>/{sub(/^>/, "");printf "%s,", $1;next}    # process lines starting with '>'
    {print length()}                             # other lines
' file_name.fa 

出力

cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

答え2

各ヘッダー行の後にシーケンス行が1つしかないと仮定すると、シーケンスをヘッダーの末尾に移動し、ヘッダーawkの最初の部分と最後のシーケンス長を抽出するために使用できます。

を使用してpaste行を読み込み、タブで区切られた2つの列に貼り付けてawk処理を渡します。

$ paste - - <file | awk -v OFS=, '{ sub("^>",""); print $1, length($NF) }'
cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

このsub()コマンドは開始>文字を削除します。

答え3

$ awk -F'[> ]' '{ printf ("%s", NR%2?$2",":length() ORS ) }' infile
cel-let-7-5p,22
cel-let-7-3p,22
cel-lin-4-5p,21
cel-lin-4-3p,22
cel-miR-1-5p,22

コードは、2セットのスペースと文字>をフィールド区切り文字として定義し、三項演算子を使用して行番号が次のようになることを(condition ? do-if-true : do-if-false)確認します。奇妙なnumber(行番号が奇数の場合は1を返します)、それ以外の場合は行番号が奇数の場合はNR%2列2の後にカンマを印刷するように選択します。$2","でもnumber(NR%2行番号が偶数の場合は0を返します)、オプションでlength()現在の行の+出力レコード区切り文字(ORS、デフォルトは改行)を印刷します。

答え4

awk '/^>/ {a=$1; next} {print a,length}' OFS=, file

関連情報