내 파일에는 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