사용하고 싶은 코드 줄이 있지만 파일의 모든 열을 반복하고 싶습니다. 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
설명이 필요하시면 댓글을 남겨주세요.