임계값보다 큰 값을 대체하는 Perl 한 줄의 코드

임계값보다 큰 값을 대체하는 Perl 한 줄의 코드

7개의 부동 소수점 값 열()이 포함된 텍스트 파일이 있습니다. Perl one-liner를 사용하여 7th열에서 임계값보다 큰 값을 찾고 싶습니다 . 그런 다음 열 값이 임계값을 초과하는 행의 ,,, 4th값 을 교체하려고 합니다 . 누군가 내가 이 작업을 수행할 수 있는 방법을 알려줄 수 있나요?5th6th7th7th0.00000000

여기에 예가 있습니다. 임계값이 1.00000이라고 가정해 보겠습니다.

  0.04718683      0.24081557      0.02831210      0.98316791      0.00000000     -0.98446111      1.39132413
  0.05662420      0.24081557      0.02831210     -0.00006975      0.00001697     -0.00144172      0.00144350
  0.06606157      0.24081557      0.02831210      0.00039672      0.00007192     -0.00001264      0.00040339
  0.07549894      0.24081557      0.02831210      0.00087559      0.00010765     -0.00028455      0.00092694
  0.08493630      0.24081557      0.02831210      0.00004609      0.00012754     -0.00030319      0.00033214
  0.09437367      0.24081557      0.02831210     -0.00038816      0.00008384      0.00011519      0.00041348

첫 번째 행의 열 값이 7th임계값보다 큽니다 1.39132413 > 1.00. 따라서 첫 번째 행을 다음 행(0 값)으로 바꿔야 하며, 다른 모든 행은 기준을 충족하지 않으므로 변경되지 않은 상태로 유지됩니다.

  0.04718683      0.24081557      0.02831210      0.00000000      0.00000000     0.00000000   0.00000000

답변1

공백을 정확히 동일하게 유지할 필요가 없으면 다음 방법을 사용할 수 있습니다.

$ perl -lane 'do{$_=sprintf("%.8f",0) for @F[3..6]} if $F[6]>1; print "@F"' file 
0.04718683 0.24081557 0.02831210 0.00000000 0.00000000 0.00000000 0.00000000 
0.05662420 0.24081557 0.02831210 -0.00006975 0.00001697 -0.00144172 0.00144350
0.06606157 0.24081557 0.02831210 0.00039672 0.00007192 -0.00001264 0.00040339
0.07549894 0.24081557 0.02831210 0.00087559 0.00010765 -0.00028455 0.00092694
0.08493630 0.24081557 0.02831210 0.00004609 0.00012754 -0.00030319 0.00033214
0.09437367 0.24081557 0.02831210 -0.00038816 0.00008384 0.00011519 0.00041348

특정 행 수를 건너뛰려면 $.(현재 행 번호) 값을 테스트하면 됩니다.

$ perl -lane 'do{$_=sprintf("%.8f",0) for @F[3..6]} if $F[6]>1 && $.>3; print "@F"' file 

관련 정보