私は、カラムフィールドタイプのファイル(1
〜6
がfield 1
,7
〜11
〜field 2
などに対応する)を持っています。置換文字列の行番号のオフセットを使用するSedパターンマッチ
キー属性は次のとおりです。
- 各行は
80
文字です。 field 2
〜field 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番目のフィールドに番号を交換したい(文字による7
11
)には、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
はそう
osed
の行番号を使用して、簡潔なソリューションを作成します。おそらく単一の
sed -i
コマンドです。唯一の複雑さが唯一の可能性があると仮定すると、少しの計算が必要になります。最初の一致は、常に2番目の行で
1
に設定する必要があります。
sed
ソリューションが必要です。私はawk
を使用することを躊躇しているので、スペースの埋め込みが重要でインライン編集が望まれているので、sed
が良い選択であるようです。
私が改善された解決策を見つけたら、*.tmp
のファイルを投げ捨てて、ターゲットファイルで直接操作するだけです。したがって、sed -i
コマンドがジョブを実行する可能性があります。
これははるかにクリーンです。私は助けに感謝します。私は2番目のフィールドだけを気にするので、awk -v OFS = '' -v FIELDWIDTHS = '6 5 69' '/^HETATM/{$ 2 = sprintf( "%5d"、++ count) }; 1 'file.pdb'! –