쉘 스크립트를 사용하여 파일의 모든 숫자 나누기

쉘 스크립트를 사용하여 파일의 모든 숫자 나누기

내 파일에는 27개의 열과 45000개의 행이 있습니다.

head test_1

    0   0   0   0   0   0   0   2   0   0   0   0   0   0   0   0   0   0   0   
    16  20  24  20  20  10  6   28  36  10  26  14  24  24  24  30  24  30  24  
    2   8   2   4   2   0   0   10  8   2   6   0   6   4   4   6   2   10  2   
    14  12  22  16  18  10  6   20  28  8   20  14  18  20  20  24  22  20  22  
    0   0   0   0   0   0   0   2   2   0   0   0   0   0   0   0   0   2   0   
    16  20  24  20  20  10  6   30  36  10  26  14  24  24  24  28  22  30  24  
    0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

쉘 스크립트를 사용하여 각 값을 상수(여기서는 2)로 나누고 싶습니다. 어떻게 해야 합니까? 비슷한 것을 시도했지만 awk -v c=2 '{ print $0/c }' test_1첫 번째 열만 인쇄됩니다!

답변1

예, awk -v c=2 '{ print $0/c }' test_1각 전체 행을 나누려고 시도하므로 첫 번째 열만 인쇄됩니다 c. 줄을 단일 숫자로 변환하면 숫자가 아닌 모든 것, 즉 첫 번째 공백과 그 이후의 모든 내용이 삭제됩니다.

대신 열을 반복해야 합니다.

awk -v c=2 '{ for (i = 1; i <= NF; ++i) $i /= c; print }' OFS='\t' test_1

이 코드는 단순히 각 열의 값을 자체적으로 나눈 값을 설정한 c다음 수정된 값이 포함된 행을 인쇄합니다. NF은 현재 행의 필드(열) 수이며 $i열의 값이 됩니다 i. 마지막으로 OFS='\t'출력 필드 구분 기호를 탭으로 설정합니다.

주어진 데이터에 대한 결과는 다음과 같습니다.

0       0       0       0       0       0       0       1       0       0       0       0       0       0       0       0       0       0       0
8       10      12      10      10      5       3       14      18      5       13      7       12      12      12      15      12      15      12
1       4       1       2       1       0       0       5       4       1       3       0       3       2       2       3       1       5       1
7       6       11      8       9       5       3       10      14      4       10      7       9       10      10      12      11      10      11
0       0       0       0       0       0       0       1       1       0       0       0       0       0       0       0       0       1       0
8       10      12      10      10      5       3       15      18      5       13      7       12      12      12      14      11      15      12
0       1       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0

답변2

매우 유사하지만 각 열을 개별적으로 나누어야 합니다.

awk -v denominator=2 '{ for( i=0;i<=NF;i++ ) { printf "%f%s",  $i/denominator, OFS }; printf "%s", ORS  }' /path/to/file

관련 정보