行で区切られたテキストを含むファイルがあります。
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文字未満の場合は何も印刷されません。)
ksh93
sに似たbash
オプションがありますが、NUL文字をサポートしていません。-N
zsh
-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