다음과 같은 테이블 데이터가 있습니다
abc 1 1 1
bcd 2 2 4
bcd 12 23 3
cde 3 5 5
cde 3 4 5
cde 14 2 25
첫 번째 열의 변수를 기준으로 각 열의 값의 합을 계산하고 싶은데 원하는 결과는 다음과 같습니다.
abc 1 1 1
bcd 14 25 7
cde 20 11 35
나는 이와 같이 awk 명령을 사용합니다
awk -F"\t" '{for(n=2;n<=NF; ++n)a[$1]+=$n}END{for(i in a ) print i, a[i] }' tablefilepath
내가 얻는 결과는 다음과 같습니다.
abc 3
bcd 46
cde 66
내 코드의 끝 부분이 잘못된 것 같은데 수정 방법을 모르겠습니다. 코드를 수정하려면 몇 가지 지침이 필요합니다.
답변1
당신은 꽤 가깝습니다. 당신이 뭘 잘못했는지 아시죠? 3개를 유지해야 했는데 각 열 1 값에 대해 하나의 합계를 유지했습니다.
이는 다음과 유사합니다.이니안의 대답하지만 원하는 수의 열을 처리하도록 쉽게 확장할 수 있습니다.
awk -F"\t" '{for(n=2;n<=NF; ++n) a[$1][n]+=$n}
END {for(i in a) {
printf "%s", i
for (n=2; n<=4; ++n) printf "\t%s", a[i][n]
printf "\n"
}
}'
Inian의 답변과 같은 세 개의 배열이 아니라 하나의 2D 배열을 유지합니다.
답변2
파일이 탭으로 구분되어 있는 한,데이터 혼합이것에 딱 맞습니다.
$ datamash groupby 1 sum 2 sum 3 sum 4 < tablefilepath
abc 1 1 1
bcd 14 25 7
cde 20 11 35
Datamash는 -t <delimiter>
. 그러나 탭은 귀하가 제공한 예제 입력에 가장 가까운 것 같습니다.
데이터 통합에 익숙해이는 입력이 임의의 공백으로 구분된 경우에 작동합니다(예: 탭처럼 보이도록 의도된 공백이 여러 개 있을 수 있음). 그럼에도 불구하고 데이터가 다음과 같이 보이더라도 datamash가 기대하는 형식으로 쉽게 통합될 수 있습니다.
sed -i 's/ \+/\t/g' tablefilepath
답변3
awk
1을 기준으로 2~4열의 합계를 냅니다.
awk -v FS="\t" -v OFS="\t" '{ col1[$1]+=$2; col2[$1]+=$3; col3[$1]+=$4; next } END { for ( i in col1) print i, col1[i], col2[i], col3[i] }' file