하나의 열을 수정하고 awk를 사용하여 모든 열을 인쇄합니다.

하나의 열을 수정하고 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

관련 정보