두 번째 열을 고유하게 만들고 해당 값을 첫 번째 열에 추가합니다.

두 번째 열을 고유하게 만들고 해당 값을 첫 번째 열에 추가합니다.

내 입력은 아래와 같습니다. 두 번째 열에는 고유 문자열만 유지해야 합니다. 여기서 첫 번째 열은 각 고유 문자열에 대한 모든 값의 합계가 됩니다.

예를 들어, OIA두 번째 열을 가져와서 첫 번째 열에 OIA의 해당 값을 추가하고 앞에 인쇄합니다 OIA.

입력하다:

1079 OIA
1079 OIA
975  OIA
975  OIA
372  CLN
243  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN
224  TLN

예상 출력:

4108    OIA
372     CLN
2483    TLN

답변1

awk '{m[$2]+=$1}END{for(i in m)print m[i],i}' file

이는 공백을 사용하여 열을 구분하는 대부분의 경우에 잘 작동합니다.

답변2

예제 입력에 표시된 대로 입력이 항상 두 번째 열 값으로 그룹화된다고 가정합니다.

$ awk '$2!=prev{if (NR>1) print sum, prev; sum=0; prev=$2} {sum+=$1} END{print sum, prev}' file
4108 OIA
372 CLN
2483 TLN

위의 코드는 메모리에 거의 아무것도 유지하지 않으므로 임의로 큰 파일에서 작동하며 입력 $2 값과 동일한 순서로 출력을 생성합니다.

답변3

GNU를 사용하여 데이터가 두 번째 열에 정렬되어 있다고 가정합니다 datamash.

datamash -W groupby 2 sum 1 <file

이는 입력을 공백으로 구분된 필드로 읽고, 데이터를 두 번째 필드로 그룹화하고, 각 그룹의 첫 번째 필드를 합산합니다.

질문에 제공된 데이터의 출력은 탭으로 구분됩니다.

CLN     372
OIA     4108
TLN     2483

이러한 필드는 질문에서 예상되는 필드와 교체됩니다. 이 문제를 해결하려면 두 번째 필드의 입력 데이터도 정렬하세요(질문과 같이 깔끔하게 정렬되지 않을 수 있는 경우).

sort -b -k 2,2 file | datamash -W groupby 2 sum 1 | awk -v OFS='\t' '{ print $2, $1 }'

관련 정보