Unix:あるファイルの列全体を別のファイルの単一の値に置き換えます。

Unix:あるファイルの列全体を別のファイルの単一の値に置き換えます。

unixを使用して、あるファイルの列を別のファイルの単一の値に置き換えたいと思います。

ファイル1は、次の構造のpdbファイルです。

HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -1.00 H  
HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -1.00 H  

次のように、列11を別のファイル(ファイル2)に格納されている単一の値に置き換えたいと思います。

[1, 27, -81.883, 4.0]
[3, 38, -66.122, 12.0]
[3, 57, -62.134, 12.0]

ファイル 2 (行 1、列 3) の値がファイル 1、列 11 の値になり、ファイル 1 が次のようになります。

HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -81.88 H  
HETATM   14  H4B FAD B 600      95.544  50.240  71.308  1.00 -81.88 H

次のコマンドを使用して、ファイル1の列11を単一の値(この場合は2)に置き換えることができます。

awk '{$11=2}1' File1

私はこのコードを見つけました。https://stackoverflow.com/questions/7846476/replace-column-in-one-file-with-column-from-another-using-awk

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

しかし、file2から希望の値をfile1にインポートするには、awkとsedの組み合わせを使用する必要があると思います。

次のコードは、列11の最初の行を提供します。

awk 'FNR==1{print $11}'

私はこれら2つを組み合わせる方法を知りません。

データセットごとに値が変更されるため、値で取得できません(何百ものpdbファイルを変更する必要があります)。

誰でも助けることができますか?

以下の両方のソリューションは私のpdbファイル形式を台無しにしました。つまり、次のような結果が得られた。

HETATM 1 PA FAD B 600 95.887 47.194 74.387 1.00 -73.248 

変える

HETATM    1  PA  FAD B 600      95.987  47.188  74.293  1.00 -73.248

私が何か間違っているのか、それともどんなアイデアがあるのでしょうか?

答え1

まず、ファイル2から目的のフィールドを抽出します。

value="$(awk -F, 'NR==1{print $3;exit}' file2)"

次に、ファイル1の代替コードに挿入します。

awk '{$11 = v} 1' v="$value" file1

答え2

必要な値は最初の行の3番目の列であるため、file2次のようにして取得できます。

$ awk 'NR==1{print $3}' file2
-81.883,

しかし、これには望ましくないカンマも含まれます。これを防ぐには、awk次のように言うことができます。誰でもスペースまたはフラグをフィールド区切り文字として使用します-F

$ awk -F", " 'NR==1{print $3}' file2
-81.883

awkを使用すると、次のオプションを使用してコマンドラインで変数を設定できます-v

   -v var=val
   --assign var=val
          Assign the value val to the variable var,  before  execution  of
          the  program  begins.  Such variable values are available to the
          BEGIN rule of an AWK program.

したがって、を実行すると、awk -vfoo="-81.833" {...}awkスクリプトはその値を変数として使用できます-81.33fooと組み合わせるとコマンドの置き換えawk、最初のコマンド(必要な値)の出力を変数(呼び出されるなどi)で、11番目のフィールドを変数の値に置き換える2番目のスクリプトに渡すことができますi

$ awk -vi="$(awk -F", " 'NR==1{print $3}' file2)" '{$11=i}1;' file1
HETATM 14 H4B FAD B 600 95.544 50.240 71.308 1.00 -81.883 H
HETATM 14 H4B FAD B 600 95.544 50.240 71.308 1.00 -81.883 H

答え3

私は問題をよく理解していませんでしたが、とにかく解決策を見つける危険があると思いました。

sed -nse'1!{  :out
              1x
              s/  */&\n/10
              s/^/ /p;t
           }
           x; s/..*//;t out
           g; s/[^ ]* *[^ ]* *//
              s/ .*//;p
           x;    :eat
           $d;n;b eat
'  file1 file2 file3 file4 |
sed '      /^ /!{h;d;}
           s///;N;G
           s/\n[^ ]*\(.*\)\n\(.*\)/\2\1/
'

これは効果があるかもしれません。別の入力ファイルストリームをsed処理するファイルがある場合は、-sファイル1で必須フィールドのみを選択し、そのフィールドをファイル全体に書き込むか、次の入力ファイルの各出力を表示して準備し、2番目のファイルをOKとしてマークする必要があります。sed問題のフィールドを変更できます。

デフォルトではファイルペアで動作します。 2つの読み取りファイルの最初から始めてソース列を印刷し、そのソース列を各ペアの2番目に編集します。

関連情報