1つの列を変更し、awkを使用してすべての列を印刷します。

1つの列を変更し、awkを使用してすべての列を印刷します。

次のコードを使用して$ 2を修正したいと思います。

cat file | awk '{printf "%.15f\n", $2 = 1-$2}' > new_file

コードは操作を実行し、小数点以下の15桁を印刷し、1-nを計算します。ただし、他の列は印刷されません。次のコードを使用してこれを実行しようとすると印刷されますが、別の行に印刷されます。

cat file | awk '{printf "%.15f\n", $2 = 1-$2; print $0}' > new_file

私のオリジナルファイル:

752566 0.883928571428571 1 rs3094315 0
752721 0.765873015873016 1 rs3131972 0
752894 0.883928571428571 1 rs3131971 0
753541 0.268849206349206 1 rs2073813 0

出力:

752566 0.116071 1 rs3094315 0
0.116071428571429

希望の出力(列の順序は重要ではありません):

752566 1 rs3094315 0 0.116071428571429

答え1

sprintf新しい値をフォーマットされた文字列として印刷し、それを新しい値として指定できます$2

$2 = sprintf("%.15f",1-$2)

次に、完全な(修正された)レコードを印刷します。

$ awk '{$2 = sprintf("%.15f",1-$2); print}' file
752566 0.116071428571429 1 rs3094315 0
752721 0.234126984126984 1 rs3131972 0
752894 0.116071428571429 1 rs3131971 0
753541 0.731150793650794 1 rs2073813 0

答え2

それはawkでなければなりませんか?

$ cat in
752566 0.883928571428571 1 rs3094315 0
752721 0.765873015873016 1 rs3131972 0
752894 0.883928571428571 1 rs3131971 0
753541 0.268849206349206 1 rs2073813 0

$ perl -pe 's/(\d+\.\d+)/sprintf("%.15f", 1-$1)/e' < in
752566 0.116071428571429 1 rs3094315 0
752721 0.234126984126984 1 rs3131972 0
752894 0.116071428571429 1 rs3131971 0
753541 0.731150793650794 1 rs2073813 0

答え3

dc電卓コマンドを使用できます。精度幅は$ precsn変数に格納され、デフォルトの精度は6に設定されます。出力順序が一致する必要はないので、dcのLiFO特性のため、逆の順序で印刷します。

precsn=15
sed -Ee 's/\S+/[&]/4' file |
dc -e "
${precsn:-6}k
[q]sq
[n32anz2<p]sp
[?z0=q lpx 1r-1/0 nn32an pcz0=?]s?
l?x
"
0 rs3094315 1 0.116071428571429 752566
0 rs3131972 1 0.234126984126984 752721
0 rs3131971 1 0.116071428571429 752894
0 rs2073813 1 0.731150793650794 753541

関連情報