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.33
。foo
と組み合わせるとコマンドの置き換え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番目に編集します。