파일에 집계 숫자를 추가하는 방법

파일에 집계 숫자를 추가하는 방법

같은 문자열의 값을 다른 줄에 추가하는 스크립트를 작성해야 합니다.

예를 들어, 파일에 다음이 포함되어 있는 경우:

abc,10
xyz,20,
abc,30,
ghd,40
xyz,10

스크립트는 파일에서 일치하는 문자열 abc등을 확인 xyz하고 해당 값을 추가하고 출력을 새 파일로 리디렉션해야 합니다.

출력은 다음과 같아야 합니다.

abc,40,
xyz,30,
ghd,40

이에 대한 스크립트를 작성할 수 있나요? 어떤 의견이라도 도움이 될 것입니다.

답변1

Perl에서는 쉽습니다. 해시를 사용하여 누계를 저장하세요.

perl -laF/,/ -ne '
    $h{ $F[0] } += $F[1];
    }{
    print "$_,$h{$_}" for keys %h;
' input-file > output-file
  • -n입력을 한 줄씩 읽습니다.
  • -l개행 문자 추가print
  • -a각 입력 행을 @F 배열로 분할
  • -F/,/-a쉼표로 구분하여 알려주세요 .
  • }{-n입력이 끝날 때 실행될 코드와 루프를 분리하는 "Eskimo Greeting" 연산자입니다 .

답변2

어때요 bash:

for i in $(cut -d ',' -f1 FILE  | sort | uniq)
do
    echo -n "$i", &&
    echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc)
    echo $(echo "$i" | grep -E -o ",$") || echo
done

아니면 놓치게 될 경우 ,:

for i in $(cut -d ',' -f1 FILE  | sort | uniq)
do
    echo -n "$i", &&
    echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc) &&
    grep -E -o "$i,[0-9]+,$" FILE >/dev/null && echo ',' || echo
done

또는 토큰 순서를 저장하려면 다음을 수행하십시오.

for i in $(cut -d ',' -f1 FILE  | awk '!seen[$0]++')
do
    echo -n "$i", &&
    echo -n $(grep "^$i," FILE | cut -d',' -f2 | paste -sd+ - | bc) &&
    grep -E -o "$i,[0-9]+,$" FILE >/dev/null && echo ',' || echo
done

FILE실제 파일 이름으로 바꾸십시오 .

답변3

awk -F, -v OFS=, '{
          str[$1]+=$2;
          next
     }

     END {
          for (s in str) {
              print s, str[s]
          } 
     }' filename

각 문자열(필드 1)의 누적 합계를 포함하는 연관 배열(즉, 정수가 아닌 문자열로 키 지정)을 구성합니다.

모든 입력을 읽으면 배열의 각 요소를 인쇄합니다.

ghd,40
abc,40
xyz,30

sort정렬된 출력을 원하면 파이프로 연결하십시오.

관련 정보