unix:ファイルから文字10〜80をインポートする

unix:ファイルから文字10〜80をインポートする

行で区切られたテキストを含むファイルがあります。

GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

ここから10から80までの文字を抽出したいです。

TGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCT

ファイルの文字数を計算する方法を見つけました。

  wc -m file

1行に文字数を取得する方法は次のとおりです。

 awk '{print substr($0,2,6)}' file

しかし、10から80までの文字を取得する方法が見つかりません。

改行文字は文字とは見なされません。

どんなアイデアがありますか?

はい、これは完全なゲノムのDNAです。私は以下を使用して、異なる足場(この場合は10と11)を含むfastaファイルからこのDNAを抽出しました。

 awk '/scaffold_10\>/{p=1;next} /scaffold_11/{p=0;exit} p'

最終的には、指定された足場から100〜800文字(または同様の文字)を取得する簡単なコマンドが必要です。

編集:質問はここに続きます。bashスクリプトの代わりにgff2fastaを使用して全ゲノムから部分DNA配列を取得する

答え1

$ cat file1
GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

各行の長さを確認してください。

$ awk '{print length,$0}' file1
70 GCAACACGGTGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
70 GTCGAGCCTAGTCCATCAGCAAATGCCGTTTCCAGCAATGCAAAGAGAACGGGAAGGTATCAGTTCACCG
70 GTGACTGCCATTACTGTGGACAAAAAGGGCACATGAAGAGAGACTGTGACAAGCTAAAGGCAGATGTAGC

10〜80文字を印刷してください。

$ awk '{print substr($0,10,70)}' RS= file1
TGGGAGCACGTCAACAAGGAGTAATTCTTCAAGACCGTTCCAAAAACAGCATGCAAGAGCG
GTCGAGCC

入力に空白行が含まれていないと仮定します(RS=有効短絡モードここで、各レコードは段落です(段落は一連の空行で区切られています)。これは、ファイル全体がメモリにロードされることを意味します。

答え2

ファイル内の改行文字をどのように処理するかを知りたいです。これは役割ですか?

10バイトを取り出し、71バイト(A、C、T、G、および改行文字)を印刷すると、Sato Katsuraの解決策が最も速くなります(これはGNUddまたはCompatibleを前提status=noneとして次に置き換えます2> /dev/null(これはエラーメッセージも隠します)。 )他の実装と共に):

 dd if=file bs=1 count=71 skip=9 status=none

改行をスキップする必要がある場合は、次のコマンドを使用してフィルタリングしてくださいtr -d '\n'

 tr -d '\n' < file | dd bs=1 count=70 skip=9 status=none

Fastaヘッダーをスキップする必要がある場合:

 grep -v '^[;>]' file | tr -d '\n' | dd bs=1 count=70 skip=9 status=none

grep -v '^[;>]' file;またはで始まるすべての行をスキップすることを示します>

答え3

バイトの場合(したがって、この例ではシングルバイト文字の場合も該当):

dd bs=1 skip=9 count=71 < file 2> /dev/null

または、GNUを使用するとより効率的ですdd

dd iflag=fullblock,skip_bytes,count_bytes skip=9 count=71 status=none < file

キャラクターの場合は、次を使用しますzsh

{
  IFS= read -ru0 -k9 discard &&
    IFS= read -ru0 -k71 text &&
    printf %s $text
} < file

(ファイルが80文字未満の場合は何も印刷されません。)

ksh93sに似たbashオプションがありますが、NUL文字をサポートしていません。-Nzsh-k一つbashはオフロード車です。

GNUの使用awk:

awk -v RS='.{1}' -v ORS= 'NR>=10 {print RT}; NR == 80 {exit}'

私たちが使用する単一の文字は正規表現とは見なされません.{1}.

もう1つのオプションは、1文字あたり4バイトのUTF-32LEなど、文字ごとに固定数のバイト(すべての可能な文字を含む)を持つ文字エンコーディングに変換することです。

< file iconv -t UTF-32LE |
   dd bs=4 skip=9 count=71 2> /dev/null |
   iconv -f UTF-32LE

答え4

perl -l -0777pe '
   my($start, $stop) = qw/10 80/; $delta = $stop - $start--;
   (undef, $_, $a) = unpack "A${start}A${delta}A*";
   $_ .= $1 while length() - y/\n/\n/ < $delta and $a =~ /(.)/g;
'  scaffolded_file_10

関連情報