다른 숫자까지 반복하고 다시 반복 시작(Awk/Bash)

다른 숫자까지 반복하고 다시 반복 시작(Awk/Bash)

아래 txt 파일에서 다음을 사용하여 전체 열 합계를 반복할 수 있습니다.

101     10
101     10
101     10.10
101     13
101     10
101     10
102     10.140
102     10
102     10
102     0.90
102     10
103     10
104     10
111     11
111     11
111     5.485e+12
111     11


 awk '{sum+=$2;} END{print sum;}' file1.txt > sum_a.txt

이제 저는 뭔가 다른 일을 하고 싶습니다. 예를 들어, 첫 번째 열 번호가 동일할 때까지 두 번째 열을 합산하고 다시 시작하고 싶습니다. seen[$1]을 사용하여 수행할 수 있나요?

awk '{ seen[$1] += $2 } END { for (i in seen) print i, seen[i] }' file1.txt

여기서 $1은 인덱스 값으로 처리됩니다.

을 사용하여 실행할 수 없었습니다 seen[$1]. 아니면 루핑을 수행하는 다른 좋은 방법이 있나요?

결과는 다음과 같습니다.

101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
101     63.10
102     40. 90

등등... 전체 열까지.

답변1

$ awk 'NR==FNR{sum[$1]+=$2; next} {print $1, sum[$1]}' file file
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

답변2

awk를 사용하여 하나의 입력 파일만 사용하려는 경우:

 $ awk -v c=1 '{ a[$1]+=$2;b[c]=$1;c+=1} END { for( i=1;i<=NR;i++ ){key=b[i]; print key" "a[key]} }' file1.txt  
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
101 63.1
102 41.04
102 41.04
102 41.04
102 41.04
102 41.04
103 10
104 10
111 5485000000033
111 5485000000033
111 5485000000033
111 5485000000033

관련 정보