数字の置換(引き算)sedコマンド

このQ&Aのポイント
  • 数字の置換(引き算)sedコマンド
  • 質問文章中の数字の置換(引き算)について、sedコマンドを使用する方法を教えてください。
  • 質問文章で紹介されているファイルの特定の列にある数字を置換(引き算)したい場合、sedコマンドを使用すると便利です。具体的な置換の方法と合わせて説明します。
回答を見る
  • ベストアンサー

数字の置換(引き算)sedコマンド?

数字の置換(引き算)sedコマンド? 1________2_________3_________4_________5_________6_________7______ 123456789012345678901234567890123456789012345678901234567890123456 ATOM______1__N___VAL_____1______38.983__13.792__44.273__0.00__0.00 … ATOM___1537__OXT_ALA____95______35.430_156.289__27.449__0.00__0.00 TER_______0______________0 ATOM___1538__N___VAL____96______39.910__13.799__36.762__0.00__0.00 … ATOM___3074__OXT_ALA___190______25.170 150.107___6.221__0.00__0.00 上記のようなファイルを対象としています。 上記のファイルの説明を行います。 初めの二行(数字とアンダーバーが書いてある部分)は説明のために付け加えたもので、ファイル中には存在しません。 上の例の3行目から本来のファイルはスタートします。 …は省略を表し、TERは本来ならば1538行目です。 TERの次の行からさらに1537行の情報があります。 これはpdbファイルというもので、18~21列目の番号は原子につけたもので、34~36列目の数字は、アミノ酸残基数を表します。また43列目以降は座標の位置を表します。 本来のファイルにはアンダーバーはありませんが、投稿時に空白はまとめられてしまうので、アンダーバーで置換しております。 ここで質問ですが、TER(1539行目)以降の34~36列目の数字を置換したいと考えております。具体的には、 96→1 97→2 … 190→95 というように置換したいと思います。 以下、留意していただきたい点を書きます。 courie newフォントで見ていただけると列が揃うので見やすいので、可能ならワードなどで張り付けてcourie newで見てください。 置換後の数字(1~95)の右端の数字は21列目になる必要があります。 置換前の数字(96~190)を含んでいる行数は一定ではありません。たとえば、96を指定の位置に持っている行は13行、97を指定の位置に持っている行は、10行などとなっております。 本ファイル(pdbファイル)の形式については、http://homepage2.nifty.com/copper29/ipr/PDBformat.html の10. Coordinate Section 10. 座標(Coordinate Section)に詳しい記述がありますので、御参考にしてください。 Sedコマンドなどを用いてやるのかなと思っておりますが、よくわかりませんので質問させていただきました。

  • mdsba
  • お礼率59% (44/74)

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

>置換後の数字(1~95)の右端の数字は21列目になる必要があります。 この 21 というはこの説明だと 36 の間違いでは? そうだとしたら awk でこんな感じでどうでしょう。 awk 'ter==1 && /^ATOM/ {printf "%s%3d%s\n", substr($0,1,23), $5-95, substr($0,27,40); next} /^TER/{ter=1} {print $0}' protein.pdb

mdsba
質問者

お礼

おっしゃる通り、36でした。 上記のawkファイルでうまく置換することができ、また、本来の目的である、プログラムによる解析も行うことができました。感謝します。 awkの基本すらまだ理解しておりませんが、いまからそれぞれどういう意味をもつか勉強したいと思います。 ありがとうございました。 この質問と回答をご覧になったかたへ。 私も調べるまで知りませんでしたが、ファイルに出力する場合、 awk 'ter==1 && /^ATOM/ {printf "%s%3d%s\n", substr($0,1,23), $5-95, substr($0,27,40); next} /^TER/{ter=1} {print $0}' protein.pdb > new.pdb とするようです。

関連するQ&A

  • sedでの置換がうまくできません。

    sedを使用して以下の様な文字列を置換したいと考えています。 iPar(\"w\") → 何かの文字列 そこで以下のようなsedスクリプトを作成しました。 s/iPar\(\"w\"\)/test/g  → a.sed 使用してみました。具体的には↓のコマンド >sed -f a.sed inputデータ >outputデータ しかし結果ファイルをみても何も変わってくれません。 なにが悪いのでしょうか? どなたかご指南下さい。

  • sed コマンドについて

    はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 linuxのシェルファイルが100以上あり、こちらの全ファイル内に含まれる文字列"ABCDE"を文字列"12345"に置換をしたいと思っています。 sed コマンドで sed -e "s/ABCDE/12345/g" *.csh のように実行しても、画面上に変換後が表示されるだけで その後、ファイルを見ても置換されていません。 どのようにすれば、全ファイルが修正されるのでしょうか。 以上です。回答の方をよろしくお願い致します。

  • Unix-sedコマンドによる置換について

    sedでコマンド次の文字列をスペースに置換したいのですが うまくいきません。BF-DR1 =(0)A[7]OPN-ENDはスペースや大カッコが含まれています。 与えたコマンドは、 sed -e "s/ BF-DR1 =(0)A[7]OPN-END//g" <bf1Open.log>rrr.txt ですが、出力ファイルはまったく置換されていませんでした。 お分かりになる方どなたかご教授ください。

  • sedコマンドに関して

    サーバーにあるファイルの中身を置換する為 Tera Termのsedコマンドを使おうとしたのですが 文字列の「'」が置換できません。 以下のように入力してみましたがだめでした。 sed -e 's/'/'aa/g' text1.txt > text2.txt sed -e 's/\'/\'aa/g' text1.txt > text2.txt 出来ないんでしょうか!? 宜しくお願いいたします。

  • sedコマンド置換について(マッチした数字を演算に再利用したい)

    こんにちは Linuxのsedコマンドについて質問させてください。 軽く検索をかけたりUNIXのコマンド本を調べましたが、わかりませんでした。 例えば正規表現でマッチした数字を2倍して返す処理をする場合 perlではhogeという文字列に対して  hoge=~s/(\d+)/$1*2/g; このような処理で実現できると思います。 このように今マッチしたものに対して何か処理を行って置換するということは sedコマンド、もしくはそれを使ったシェルスクリプトで処理することは可能でしょうか? sedの方が処理速度が速いので、こちらを使いたいのです。

  • sedコマンドを使用して、文字の置換を行いのですが助けてください。

    sedコマンドを使用して、文字の置換を行いのですが助けてください。 sedコマンドやawkコマンドなどを使って、aliasesファイルの置換を行いたいのですが、 うまくいかないので教えていただけないでしょうか? 知りたいのは、次のような置換を一括で行うことのできるコマンドです。 ■置換前のファイル ================= AAAA:  :include:/file/name BBBB:  :include:/file/name CCCC:  :include:/file/name ================= ■置換後のファイル(希望する置換結果) ※1フィールド目の任意の文字列をメールアドレスのローカルパートとして利用したい ================= AAAA:  AAAA@example.com BBBB:  BBBB@example.com CCCC:  CCCC@example.com ================= 以上です。

  • sedで置換対象となる文字列の制限は変更できますか?

    こんにちは。 今、あるファイル(30個)の1行が45000以上あります。 このファイルの中の文字列を一括置換したいと思い、 sed文にて行ってみましたが、 "input line too long”とメッセージが出て置換が出来ません。 対象のファイルの1行を40959に短くして、実験したところ、置換できました。 この45000以上の文字列置換を実現させるには、何か良い方法がありますでしょうか? 環境は、OS:xp、MKSを使っています。 よろしくお願いします。

  • sedスクリプト 置換

    この度、はじめてsedスクリプトをかいてみようと思っています。 以下の機能を持った置換スクリプトを書きたいのですが、 アドバイスなど頂ければ幸いです。 ・abcディレクトリ内を検索して(サブディレクトリも含む)、test.txtというファイルを探し出す(test.txtは複数あります) ・検索された複数のtext.txtを一括で置換する ↓置換内容 ・test.txtの5行目にある文字列を1からはじまる連番に置換する(test.txtは複数あるので、処理した順に連番をつけていく) イメージが伝わりにくい場合は、どうかご指摘ください。 よろしくお願いします

  • sed で \ を含む文字列に置換

    現在、非常に多数のドキュメントの整形を LaTeXを使って自動的に行っています。 問題となっている処理のエッセンスを抜き出すと次のようなもので、テンプレートファイル中の __PATTERN__ という文字列を、その都度指定する文字列($string)に置換した後にplatexでコンパイルする、という流れです。 ---------- #!/bin/bash sed "s/__PATTERN__/$string/" < template.tex > document.tex platex document.tex ---------- 問題は、$string に '_'(アンダーバー)が含まれるケースで、platexのコンパイルでエラーが発生します。 これを回避するには、'_' を '\_' に置換する必要がありますが、上記処理の前に、$string 中の '_' を '\_' に置換する処理を加えても、上記処理の段階で '\' が消えてしまいます。 肝は sed でのエスケープのやり方だと思うのですが、どうにもうまく行きませんので、お知恵を拝借できればと思います。 なお、tex ファイル中、__PATTERN__ は、他のコマンドの引数内で使用されているため、\verb+ + で囲むという手段も使えません。

  • sedコマンドの置換パターン条件について

    シェルスクリプトについて質問です。 /etc/ssh/sshd_configのAllowUsers行にユーザを追加&削除、sshdをリスタートするスクリプトを作っています。 ユーザ追加の処理はsedコマンドで実現できました。 sed -i -e "s/^AllowUsers/AllowUsers $USERNAME/" $CONF_FILE そして、悩んでいるのがユーザ削除時の処理です。 "AllowUsersで始まる行の中で" 且つ "変数$USERNAME" に一致する部分を削除するという処理です。sedは複数条件を指定することもできますが、以下記述の場合、2つの条件が独立して処理されてしまいます。 sed -e "s/^AllowUsers/AllowUsers/" -e "s/ $USERNAME//" $CONF_FILE ($USERNAMEに一致する部分はAllowUsersで始まらない行でも置換される) sedにAND条件のような使い方は可能でしょうか。 環境はCentOS 5.3、シェルはbashを使っています。 よろしくお願いいたします。