awk의 특정 열에 numfmt 적용

awk의 특정 열에 numfmt 적용

저는 특정 디렉터리에 있는 모든 사용자의 디스크 사용량을 분석하기 위해 스크립트 tcsh(예...알지만 그래야 합니다)를 작성 중입니다.

마지막으로 다음 형식으로 보고서를 생성하고 싶습니다.

user1 1.6GB
user2 1.1GB
..
user69 10MB

먼저 나는 달린다

find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}' > example.tmp

그런 다음 다음을 통해 두 번째 열을 사람이 읽을 수 있는 크기로 변환했습니다.

awk '{ print $2 }' example.tmp | numfmt --to=iec-i --suffix=B --padding=7

하지만 이전 열이 있던 위치로 다시 병합할 수는 없습니다. 합계 numfmt에 명령을 직접 삽입하는 방법이 있나요 ?awk

저는 "awk" 명령이 좀 약한 편이라 부족한 코드를 용서해주세요.

답변1

형식을 두 번째 필드로만 직접 제한하는 옵션을 사용하면 --field이 작업을 피할 수 있습니다.numfmt

find . -printf "%u  %s\n" | 
  awk '{user[$1]+=$2}; END{ for(i in user) print i, user[i]}' | 
  numfmt --field=2 --to=iec-i --suffix=B --padding=7

awk에서 특정 값을 적용해야 하는 경우 numfmt간단한 경우에 작동하지만 필요하지 않은 변형은 다음과 같습니다 getline var.

find . -printf "%u  %s\n" | 
  awk '
    {user[$1]+=$2}
    END {
      cmd = "numfmt --to=iec-i --suffix=B --padding=7"; 
      for(i in user){ printf "%s ", i; print user[i] | cmd; close(cmd) } 
    }
  '

답변2

예를 들어, numfmt내에서 명령을 호출하여 이 작업을 수행 할 수 있습니다 .awk

awk '{cmd=sprintf("numfmt --to=iec-i --suffix=B --padding=7 %d",$2); cmd | getline converted; close(cmd); print $1,converted}' example.tmp

이 방법으로 첫 번째 호출 awk에서 직접 구현할 수도 있습니다.

find . -printf "%u  %s\n" | awk '{user[$1]+=$2};
  END{
     for(i in user) {
        cmd=sprintf("numfmt --to=iec-i --suffix=B %d",user[i]);
        cmd | getline converted;
        close(cmd);
        printf("%s % 7s\n",i,converted)
     }
  }'

답변3

테스트를 거쳐 잘 작동함

#!/usr/bin/python
import os
import subprocess
from os import *
users=[]
for i,j,k in os.walk('<directory>'):
    for m in  k:
        fil=str(i)+str(m)
        if os.path.isfile(fil):
            if os.stat(fil).st_uid not in users:
                users.append(os.stat(fil).st_uid)



for u in users:
    size=0
    for i,j,k in os.walk('<Directory>'):
        for z in k:
            fil=str(i)+str(z)
            if os.path.isfile(fil):
                if (os.stat(fil).st_uid == u):
                    size=os.stat(fil).st_size+size
    cmd1="getent passwd {0}".format(u)
    ou1=subprocess.Popen(cmd1,stdout=subprocess.PIPE,shell=True).communicate()[0].strip().split(':')[0]
    print size,ou1
~                                                                                                                                             
~                    

관련 정보