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