다른 열의 변수를 기반으로 한 열의 값 합계를 얻는 방법은 무엇입니까? [복사]

다른 열의 변수를 기반으로 한 열의 값 합계를 얻는 방법은 무엇입니까? [복사]

다음과 같은 테이블 데이터가 있습니다

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

awk1을 기준으로 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

관련 정보