내 입력은 아래와 같습니다. 두 번째 열에는 고유 문자열만 유지해야 합니다. 여기서 첫 번째 열은 각 고유 문자열에 대한 모든 값의 합계가 됩니다.
예를 들어, 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 }'