- ベストアンサー
X行N番目の文字の置換(正規表現?)
生物学カテゴリーで同様の質問をさせていただきましたが、 回答を得ることができませんでしたので、ここで質問させていただきます。ここでの質問後に、生物学カテゴリーの質問は消去させていただきます。 私はPDB(protein date bank)ファイルを扱っております。 扱うソフトウェアによって書式が少しずつ変わっております。 そのため以下のような問題が生じております。 ここで、私が用いているソフトの出力形式では、 ATOM 1 N Met 001 -0.917 -70.390 0.893 というように出力されます(投稿時に連続する複数の空白が、一つの空白にまとめられてしまいます。ご了承ください。ちなみに、空白は左から6、2、3、3、…となっております。)。 別のソフトに入力するためには、 ATOM 1 N Met A 001 -0.917 -70.390 0.893 というように、Metと001の間に記号(前半の100行に対してはA、後半100行に対してはB)を入れる必要があります。 手動で一つ一つ入れる、というのも一つの方法ですが、時間がかかります。 現実的には、 1)linuxの文字変換コマンド(sedなど)を用いて、変換する。 2)pdbファイル変換ソフトを用いて、ファイルを変換する。 という方法が考えられます。 1)については、自分でやってもうまくいかず、 2)については、そのようなソフトがあるか探してみたのですが、見つけることができませんでした。pdbファイル、というのは別の種類のファイルを指すこともあるようで、google検索はうまくいきませんでした。 上記の変換を簡単に行う方法を御存知の方がいらっしゃれば、御教授お願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
行のフォーマットがすべて同じならば No2 の補足に書かれたのと似たような方法で できるのではないかと思います。A (または B) の前後に必要な空白数によっては、 . の数や A (または B) の後ろの空白数で調整する必要があるかも知れません。 $ sed -e "1,100s/^......................./&A /; 101,$s/^......................./&B /" A.pdb > B
その他の回答 (5)
- kumoz
- ベストアンサー率64% (120/185)
次の sed 文では、2つ目の3つの空白を " A " (または " B ") に変更しています。 置き換え部の /\1A\2/ は A の前後に空白1つですので、A の前後に空白を入れることで 空白数を調整することができます (/\1B\2/ も同様)。 $ sed -e "2,101s/\([^ ] \) \( [^ ]\)/\1A\2/2; 103,202s/\([^ ] \) \( [^ ]\)/\1B\2/2;" A.pdb > B
お礼
ありがとうございます。 わたし側に原因があるかもしれませんが、残念ながらうまくいきませんでした。 自分なりに勉強して、なおかつみなさんの意見を参照しながらやってみたところ、 sed -e "2,101s/^\(.....................\) /\1A/; 103,202s/^\(.....................\) /\1B/;" A.pdb > B というコマンドでうまくいくようです。 いまから考えてみると、 「行頭から22番目の文字は必ず空白であり、この空白をAもしくはBで置換したい場合、どのようにすればいいですか」と聞くべきでした。 残念ながら、初心者であり適切な質問ができず、申し訳ありませんでした。 ご回答していただいたみなさんありがとうございました。 今後共、ご指導ご鞭撻の程よろしくお願いいたします。
ANo.1で回答した者です。補足情報をありがとうございます。 問題のファイルは固定長レコードなのですね。 > 空白は左から6、2、3、3、…となっております これだと分かりにくいので、1行の構造を以下のような形式でお知らせください。 C(6)C(2)N(4)S(2) C(6)は文字で6文字をあらわす。4文字の場合は2文字が空白になる。 C(2)は文字で2文字をあらわす。 N(4)は数値で4文字(小数点を含む)をあらわす。 S(2)は2文字文の空白をあらわす。本件では発生しないのかもしれませんが、念のため。
補足
たびたびありがとうございます。 C(6)N(5)S(1)C(4)C(1)N(3)S(1)C(1)N(4)… 最後の方のC(1)の部位にA、もしくはBを入れたいと考えております。 http://homepage2.nifty.com/copper29/ipr/PDBformat.html の 10. Coordinate Sectionに具体的な記述があります。 よろしければ参考にしてください。
- kmee
- ベストアンサー率55% (1857/3366)
sedは 範囲指定コマンド という感じで、コマンドを実行する範囲を指定できる 最初の100行は1,100 次の100行は101,200 Metの後にAを入れるには s/Met */&A / Metの後にBを入れるには s/Met */&B / 以上を組み合わせて sed '1,100s/Met */&A /;101,200s/Met */&B /;' < in.pdb > out.pdb 空白による桁合せが意味があるようなら、awkやperlで printf等の書式付きの出力を使うのがいいでしょう。
お礼
御指摘の通り、空白による桁合わせに重要な意味があるよで、そのままでは空白の数が各行一つ多くなってしまうため、インプットすることができなかったです。 gsubコマンドというのが重要なようですが、自分なりに調べてみてもよくわかりませんでした。 ありがとうございます。
補足
御回答ありがとうございます。 説明不足で申し訳ありませんが、 Metというのはメチオニンというアミノ酸の略称で、 それ以外にもAla、Cys、Asp、…、Tyrと二十程度あります。 その場合は、 s/Ala\|Cys\|Asp\|Met\|…\|Tyr */&A といった感じでいいのでしょうか。 空白による桁合わせに意味があるかどうか…。 PDBファイルの形式としては、”ある”ということなのですが、 ソフトウェアによっては”ない”のかもしれません。 linuxパソコンが空いて、試したのち、御報告できるように努力します。
- Tacosan
- ベストアンサー率23% (3656/15482)
sed で「1~100行目まで」とか「101~200行目まで」って感じで置換するという手もありえますね. あなたがどうやって「うまくいかなかった」のかは分かりませんが.
補足
御回答ありがとうございます。 後半部分についてですが、 linux、コマンド、スクリプトにまったくの不慣れなため、いいかえると初心者ですので、単純に御指導を仰ぎました。 よくよく考えてみると、おっしゃる通り、このようなことを試してみたがうまくいかなかった。ということを書くべきでした。 申し訳ありません。 ちなみに試したことは、 $ sed -e "s/...................../....................A/g" A.pdb > B としたところ、 ....................A....................A90 0.893 といった感じになってしまいました。 sedや"."のルールを考えてみると当然か、という気がしたものの、どう改善すべきかということが分かりませんでした。
Linuxは利用できる環境なのですよね。 では、下記のawkスクリプトを "hoge.awk" というテキスファイルとして保存し、 commandにある通りにスクリプトを実行してみて下さい。 -- hoge.awk ------------------- { if (NR <= 100) c = "A"; else c = "B"; printf("%s %s %s %s %s %s %s %s %s\n", $1, $2, $3, $4, c, $5, $6, $7, $8); } -- command ------------------- cat データファイル | awk -f hoge.awk > 出力ファイル
お礼
お礼が遅くなってすみません。 試してみましたが、残念ながら空白が一つにまとめられてしまうため、pdbファイルの書式から外れてしまったためか、うまくいきませんでした。
補足
ありがとうございます。 現在は他の人がlinuxを用いているため、すぐに実行できないのが残念です。 とりあえずスクリプトやコマンドの意味を自分なりに勉強させていただきます。
お礼
御回答ありがとうございます。 おっしゃるコマンドを実行してみましたが、空白が一つ多くなるためうまくいきませんでした。 質問内容をより正確にすると、 「私はPDB(protein date bank)ファイルを扱っております。 扱うソフトウェアによって書式が少しずつ変わっております。 そのため以下のような問題が生じております。 ここで、私が用いているソフトの出力形式では、 ATOM 1 N Met 001 -0.917 -70.390 0.893 というように出力されます(投稿時に連続する複数の空白が、一つの空白にまとめられてしまいます。ご了承ください。ちなみに、空白は左から6、2、3、3、…となっております。)。 別のソフトに入力するためには、 ATOM 1 N Met A 001 -0.917 -70.390 0.893 というように、Metと001の間に記号(1行目は別の書式、2~101行目にはA、102行目は別の書式、103~202行目はB)を入れる必要があります。 手動で一つ一つ入れる、というのも一つの方法ですが、時間がかかります。 そこで質問内容をいいかえると、 2~101行の22列目の空白をA 103~202行の22列目の空白をBに置換したいと思っております。 awkのgsubを用いればできるような気もしますが、 私は初心者のため、awkスクリプトやコマンドをうまく書くことができませんでした。 どなたか御教授いただけるとありがたいです」 御回答者の方々の多くは、すでに解決済みと考えていると思います。大変申し訳ないのですが、明日、御回答がない場合、もう一度上記の内容で質問させていただきたいと考えております。