awk 없이 쉘 스크립트에서 그룹화 및 합산

awk 없이 쉘 스크립트에서 그룹화 및 합산

다음과 같은 파일이 있습니다.

$ cat input.csv
201,100
201,300
300,100
300,500
100,400

1열과 동일한 값을 2열에 추가하고 싶습니다. 예상 출력은 다음과 같습니다.

$ cat output.csv
201,400
300,600
100,400

명령을 통해 이 작업을 시도했지만 awkSolaris에서는 작동하지 않습니다. 몇 가지 대안을 제시해 주세요.

답변1

나는 이것이 할 것이라고 생각합니다 :

awk 'BEGIN{FS=OFS=","}{a[$1]+=$2}END{ for (i in a) print i,a[i]}'

답변2

순수 bash단일 라인:

unset x y sum; while IFS=, read x y; do ((sum[$x]+=y)); done <  input.csv; for i in ${!sum[@]}; do echo $i,${sum[$i]}; done

또는 더 읽기 쉬운 형태로:

unset x y sum
while IFS=, read x y; do
    ((sum[$x]+=y)); done < input.csv
for i in ${!sum[@]}; do
    echo $i,${sum[$i]}
done

결과:

100,400
201,400
300,600

답변3

이렇게 하면 python작업을 보다 효율적으로 수행할 수 있습니다. 기본적으로 프로그램에서는 파일 이름이 "file.txt"일 것으로 예상하며 필요한 경우 변경할 수 있습니다.

#!/usr/bin/env python3

col1, col2 = [ list(y) for y in zip(*[ x.strip().split(',') for x in open('file.txt').readlines() if x != '\n' ]) ]

for (offset,x) in enumerate(list(col1)):
    value = 0
    while col1.count(x) > 1:
        index = col1.index(x)
        col1.pop(index)
        value =  int(col2.pop(index))

        index = col1.index(x)
        col2[index] = int(col2[index]) + value

for x, y in zip(col1, col2):
    print(x,',',y)

산출:

201 , 400
300 , 600
100 , 400

관련 정보