printf를 사용하여 형식을 $0으로 설정

printf를 사용하여 형식을 $0으로 설정

다음 데이터 세트에 대한 행 평균을 계산하고 있지만 아래 표시된 파일 출력을 생성하기 위해 $0의 형식을 올바르게 지정할 수 없습니다. 나는 현재 다음을 가지고 있습니다:

awk '{T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "??f 6.3f\n",$0,T}' fileinput > fileoutput

파일 입력

1   2   3   4
3   3   8   8
5   4   13  12
7   5   18  16
9   6   23  20
11  7   28  24
13  8   33  28
15  9   38  32
17  10  43  36
19  11  48  40
21  12  53  44
23  13  58  48
25  14  63  52

예상되는 파일 출력

1   2   3   4   2.5
3   3   8   8   5.5
5   4   13  12  8.5
7   5   18  16  11.5
9   6   23  20  14.5
11  7   28  24  17.5
13  8   33  28  20.5
15  9   38  32  23.5
17  10  43  36  26.5
19  11  48  40  29.5
21  12  53  44  32.5
23  13  58  48  35.5
25  14  63  52  38.5

답변1

조금 번갈아가며awk

awk -F'\t' 'BEGIN {OFS=FS}{s=$1; for (i=2;i<=NF;i++) s+=$i; $(NF+1)=sprintf("%.1f", s/NF)}1' file

설정을 통해 입력 및 출력 파일 형식을 동일하게 유지하십시오 OFS=FS( tab파일에 a를 사용했습니다).

0으로 설정할 필요 없이 나머지를 s설정하고 반복하기만 하면 됩니다.s=$1for (i=2;...

그러면 sprintf합계가 $(NF+1)기본적으로 인쇄될 수 있습니다 $0( OFS즉, 1마지막 합계).

1       2       3       4       2.5
3       3       8       8       5.5
5       4       13      12      8.5
7       5       18      16      11.5
9       6       23      20      14.5
11      7       28      24      17.5
13      8       33      28      20.5
15      9       38      32      23.5
17      10      43      36      26.5
19      11      48      40      29.5
21      12      53      44      32.5
23      13      58      48      35.5
25      14      63      52      38.5

할 수는 있지만

awk '{s=$1; for (i=2;i<=NF;i++) s+=$i; $(NF+1)=sprintf("%.1f", s/NF)}1' file | column -t
1   2   3   4   2.5
3   3   8   8   5.5
5   4   13  12  8.5
7   5   18  16  11.5
9   6   23  20  14.5
11  7   28  24  17.5
13  8   33  28  20.5
15  9   38  32  23.5
17  10  43  36  26.5
19  11  48  40  29.5
21  12  53  44  32.5
23  13  58  48  35.5
25  14  63  52  38.5

답변2

형식 문자열은 awk printf()C 와 동일한 규칙을 따르 printf()므로 원칙적으로

awk '{T=0; for (i=1;i<=NF;i++) T+=$i; T/=NF; printf "%s%s%6.3f\n",$0,OFS,T}' fileinput > fileoutput

작동해야합니다.

현재 시도에 필요한 최소한의 변경 사항은 다음과 같습니다.

printf "%s %6.3f\n",$0,T

그러나 단일 공백이 아니라 a 또는 기타 항목인 경우 출력 필드 구분 기호의 실제 값을 구분 $0하고 사용 하는 것이 좋습니다 .TOFSTAB

관련 정보