awk를 반복하여 열에 있는 각 정수의 백분율을 계산합니다.

awk를 반복하여 열에 있는 각 정수의 백분율을 계산합니다.

사용하고 싶은 코드 줄이 있지만 파일의 모든 열을 반복하고 싶습니다. awk 외부에서 이 작업을 수행할 수 있지만 정말 느립니다. 내 문제는 내가 awk 내에서 루프를 잘 수행하지 못한다는 것입니다. 간단한 awk 루프를 실행할 수 있지만 아직 수행할 수 없는 작업이 필요합니다. 따라서 이 문제를 해결하는 방법을 설명해 주시면 나중에 도움이 될 것입니다.

awk 명령은 이제 선택한 열($i)에 있는 각 정수의 해당 백분율을 인쇄합니다. 이것은 현재 awk 명령입니다: awk -F ',' -v x=$i 'FNR==NR{s+=$x;next;} {printf "%s\n",100*$x/s}' File File

위 명령에 대한 입력 예:

1    
4    
3    
2    

위 명령의 출력 예:

10.00000    
40.00000    
30.00000        
20.00000        

awk에서 파일의 모든 열을 반복해야 합니다(파일 열 번호를 알 수 없음).

따라서 입력에 둘 이상의 열이 있는 경우 입력 예는 다음과 같습니다.

1,4,2    
4,4,1  
3,1,6    
2,1,1    

출력 예:

10.00000,40.00000,20.00000    
40.00000,40.00000,10.00000  
30.00000,10.00000,60.00000    
20.00000,10.00000,10.00000    

다음은 제가 시도한 것입니다(아래). 분명히 잘못된 것입니다. 두 부분 모두에 대해 루프를 실행해 보았지만 전혀 출력이 나오지 않았습니다.

awk -F"," 'NR==FNR { for (i=1;i<=NF;i++) {s+=$i;next;} next } { for (i=1;i<=NF;i++)printf "%s%%\n",100*$i/s }' File File

답변1

당신은 멀리 있지 않습니다. 그러나 for 루프를 넣는 것은 첫 번째 필드에서 실행되고 다음 행으로 이동하며 해당 행의 다른 필드를 무시하기 next때문에 실수입니다 .next

awk -F ',' '
    NR==FNR{
        for(i=1;i<=NF;i++){s[i]=s[i]+$i}
        next
    }
    {
        for(i=1;i<NF;i++){printf "%f,",100*$i/s[i]}
        printf "%f\n",100*$NF/s[NF]
    }
' File File

s귀하의 시도에서는 일반 변수이지만 배열이어야 합니다. 따라서 s[i]파일이 한 번 구문 분석된 후 열의 합계가 포함됩니다 .i

NF마지막 쉼표를 제외한 모든 필드가 인쇄되어야 하므로 마지막 루프는 포함되지 않습니다 . 마지막 필드 뒤에는 개행 문자가 인쇄되어야 합니다.

산출:

10.000000,40.000000,20.000000
40.000000,40.000000,10.000000
30.000000,10.000000,60.000000
20.000000,10.000000,10.000000

설명이 필요하시면 댓글을 남겨주세요.

관련 정보