2016-05-19 5 views
1

私は、カラムフィールドタイプのファイル(16field 1,711field 2などに対応する)を持っています。置換文字列の行番号のオフセットを使用するSedパターンマッチ

キー属性は次のとおりです。

  • 各行は80文字です。
  • field 2field Nのテキストは、常に rightとなります。

私のようなファイルがあります:

HETATMレコードの場合
REMARK 1 
HETATM 1 
HETATM 5 
HETATM 6 
HETATM 7 
HETATM 9 
HETATM 12 
HETATM 15 
HETATM 19 
HETATM 23 
HETATM 27 
HETATM 30 
HETATM 34 
HETATM 38 
END 

...最初の6個の原子がその文字列と等しい行を...私は2番目のフィールドに番号を交換したい(文字による711)には、1で始まるエントリ番号が付いています。私は出力として表示する

すなわち:

REMARK 1 
HETATM 1 
HETATM 2 
HETATM 3 
HETATM 4 
HETATM 5 
HETATM 6 
HETATM 7 
HETATM 8 
HETATM 9 
HETATM 10 
HETATM 11 
HETATM 12 
HETATM 13 
END 

は現在、(私の元を台無し避けるために、テストのための一時ファイルを使用して)私の最も簡潔な解決策は以下のとおりです。

削除
#!/bin/bash 
f=file.pdb 
fTmp=${f}.tmp 
cp $f $fTmp 
for ((l=1; l<$(wc -l $fTmp | awk '{print $1}'); l++)); do 
    sed -i "$((l + 1))"'s#\(HETATM\)[ 0-9]\{5\}#\1'"$(printf '%5s' $l)"'#g' $fTmp 
done 
cat $fTmp 
rm $fTmp 

一時ファイルの荷物が、これは次のようになります。いくつかの方法のトンがあるべきよう

f=file.pdb 
for ((l=1; l<$(wc -l $f | awk '{print $1}'); l++)); do 
    sed -i "$((l + 1))"'s#\(HETATM\)[ 0-9]\{5\}#\1'"$(printf '%5s' $l)"'#g' $f 
done 

はそう

o sedの行番号を使用して、簡潔なソリューションを作成します。おそらく単一の sed -iコマンドです。唯一の複雑さが唯一の可能性があると仮定すると、少しの計算が必要になります。最初の一致は、常に2番目の行で 1に設定する必要があります。

sedソリューションが必要です。私はawkを使用することを躊躇しているので、スペースの埋め込みが重要でインライン編集が望まれているので、sedが良い選択であるようです。

私が改善された解決策を見つけたら、*.tmpのファイルを投げ捨てて、ターゲットファイルで直接操作するだけです。したがって、sed -iコマンドがジョブを実行する可能性があります。

答えて

1

GNU awkをお持ちの場合、入力が固定幅のフィールドになるように指定することができます。たとえば、

awk -v OFS='' -v FIELDWIDTHS='6 5 6 6 6 6 6' ' 
/^HETATM/{ $2 = sprintf("%5d",++count) };1' file.pdb 

これは、幅5のフィールド2を増加する数に編集します。

+0

これははるかにクリーンです。私は助けに感謝します。私は2番目のフィールドだけを気にするので、awk -v OFS = '' -v FIELDWIDTHS = '6 5 69' '/^HETATM/{$ 2 = sprintf( "%5d"、++ count) }; 1 'file.pdb'! –

関連する問題