다음 코드를 사용하여 $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