다른 번호로 반복하고 다시 반복 시작(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

이제 저는 다른 일을 하고 싶습니다. 예를 들어, 두 번째 열의 합계를 계산하고 첫 번째 열의 숫자가 같으면 다시 시작하고 싶습니다. saw[$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

관련 정보