CSV 파일의 특정 필드를 구문 분석하고 일치하는 패턴을 기반으로 필드를 함께 추가해야 합니다. 변수를 성공적으로 설정했지만 1~20개의 변수가 있을 수 있는 경우 변수를 추가하는 방법을 알아내는 데 도움이 필요합니다. (또는 이 문제를 해결하는 또 다른 더 쉬운 방법이 있을 수도 있습니다.)
소스 파일 콘텐츠 예:
Server-Name,Volume-Name,Vol-Size,Logical-Space-In-Use
FTWTRAQNETSQL01,FTWTRAQNETSQL01_e,2008,1989
FTWTRAQNETSQL01,FTWTRAQNETSQL01_f,106,63.698
FTWTRAQNETSQL02,FTWTRAQNETSQL02_e,2008,1989
FTWTRAQNETSQL02,FTWTRAQNETSQL02_f,106,4.155
ftwvocmpsqln01,ftwvocmpsqln01_1,1002,21.047
ftwvocmpsqln01,ftwvocmpsqln01_2,104,55.379
ftwspsqln02,ftwspsqln02_H,501,0
ftwvocmpsqln02,ftwvocmpsqln02_1,1002,20.732
ftwvocmpsqln02,ftwvocmpsqln02_2,104,55.380
출력은 각 고유 서버 이름에 대해 모든 필드 3 값과 모든 필드 4 값이 추가된 한 줄이어야 합니다. 서버에는 여러 볼륨이 있을 수 있으며 최대 20개까지 가능합니다. 필수 파일 출력은 다음과 같습니다.
Server-Name,Vol-Size,Logical-Space-In-Use
FTWTRAQNETSQL01,2114,2052.698
FTWTRAQNETSQL02,2114,1993.155
ftwvocmpsqln01,1106,76.426
ftwspsqln02,501,0
ftwvocmpsqln02,1106,76.112
Excel에서 이 작업을 약 7초 안에 수행할 수 있지만 지금까지 bash(또는 다른 셸)를 사용하여 자동화하는 솔루션을 찾지 못했습니다.
이것은 지금까지 필드 3만 살펴본 코드입니다. 고유 서버의 각 반복에 대해 변수를 올바르게 설정하지만 가변 개수의 변수를 추가하는 방법을 모르겠습니다.
for i in $( awk -F , '{print $1}' $REPORT | grep -v Server-Name | uniq )
do
c=0
for num in $( grep $i $REPORT | awk -F , '{print $3}' )
do
eval "var$c=$num";
c=$((c+1));
done
done
답변1
GNU 데이터매시 사용:
$ datamash -t, --header-in groupby 1 sum 3,4 < file.csv
FTWTRAQNETSQL01,2114,2052.698
FTWTRAQNETSQL02,2114,1993.155
ftwvocmpsqln01,1106,76.426
ftwspsqln02,501,0
ftwvocmpsqln02,1106,76.112
답변2
쉘이 아니라 "유닉스 방식"입니다:
awk -F',' 'NR==1; NR>1{s3[$1]+=$3; s4[$1]+=$4} END { for(i in s3){printf("%s,%s,%s\n",i,s3[i],s4[i])} }' file
출력 순서가 입력 순서와 일치하지 않을 수도 있습니다.
설명하다:
awk # use awk.
-F',' # set the field separator as comma (,)
' # start an awk script.
NR==1; # print first line (header)
NR>1{ # for lines other than first
s3[$1]+=$3; # add values on third field
s4[$1]+=$4 # add values on fourth field
} # close the previous {
END { # after all lines have been read
for(i in s3){ # for each index of the array
# (all unique values of field $1)
printf("%s,%s,%s\n",i,s3[i],s4[i]) # print values.
} # close the for loop.
} # close the END loop.
' file # end script code and name the file.
답변3
Miller( )를 사용하여 필드별로 그룹화된 두 mlr
열의 합계를 계산합니다 .Vol-Size
Logical-Space-In-Use
Server-Name
$ mlr --csv stats1 -a sum -f Vol-Size,Logical-Space-In-Use -g Server-Name file
Server-Name,Vol-Size_sum,Logical-Space-In-Use_sum
FTWTRAQNETSQL01,2114,2052.698000
FTWTRAQNETSQL02,2114,1993.155000
ftwvocmpsqln01,1106,76.426000
ftwspsqln02,501,0
ftwvocmpsqln02,1106,76.112000