다른 형식의 .csv 파일 데이터의 다중 열 합계를 계산할 수 없습니다.

다른 형식의 .csv 파일 데이터의 다중 열 합계를 계산할 수 없습니다.

열의 합계를 계산하려는 시나리오가 있습니다.

SAL|CAL|TAG|VAL
12.11"|"1.1"|"2.1"|"1.1
13.11"|"1.1"|"2.2"|"2.2
14.11"|"1.1"|"2.4"|"2.4

아래 코드는 출력을 제공하지 않으며 출력은 0.00입니다.

이 열 CAL VAL의 출력이 필요합니다.

awk -F'|' '{T+=$2} END { printf "%.2f\n", T }' demo.txt

산출:

6.7 5.7

답변1

파일의 구분 기호가 일치하지 않거나( |헤더 행에는 일반 구분 기호가 있지만 "|"그 뒤에 구분 기호가 있음) 구분 기호는 일치 |하지만 필드 참조가 일치하지 않습니다( "첫 번째 필드의 시작 필드와 "마지막 필드의 닫는 필드는 다음과 같습니다). 없어진).

어느 쪽이든 덧셈을 수행하려고 하면 숫자 값 0으로 변환되는 것처럼 -F'|'값을 $2설정하면 문자열로 구문 분석됩니다 ."1.1"

awk의 시스템 버전이 필드 구분 기호에 대한 정규식을 지원하는 경우 대신 선택적 선행 및 후행 따옴표와 함께 -F'"?\\|"?'허용(리터럴)을 사용할 수 있습니다.|

$ awk -F'"?\\|"?' '{T+=$2} END { printf "%.2f\n", T }' demo.txt
3.30

답변2

예상 출력에서 ​​TAG 및 VAL 열을 추가한 것 같습니다.

입력하신 CSV가 유효하지 않은 것으로 확인되었습니다. 12.11과 같은 필드를 참조할 수 없거나 "12.11"과 같은 필드를 참조할 수 있습니다. 부분 인용은 유효하지 않습니다.

이를 수행하는 방법에는 열 머리글에서 "숫자" 값을 추가하지 않는 것을 포함하여 두 가지가 있습니다. (이들 중 어느 것도 테스트되지 않았습니다.)

(a) 실제 상황에 맞게 필드 구분자를 정의합니다.

awk '-F"[|]"' 'NR == 1 { next; }
{ T3 += $3; T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

(b) 각 필드를 사용하기 전에 수정하십시오.

awk '-F|' 'NR == 1 { next; }
{ gsub ("\042", "", $3); T3 += $3; }
{ gsub ("\042", "", $4); T4 += $4; }
END { printf ("T3 %.2f T4 %.2f\n", T3, T4); }'

이것이 예이고 더 많은 열을 사용하여 이 작업을 수행할 계획이라면 T를 배열에 넣고 함수에 추가할 수 있습니다.

awk '-F|' 'NR == 1 { next; }
function Sum (f) {
    gsub ("\042", "", $(f)); T[f] += $(f);
}
{ Sum(2); Sum(3); Sum(5); Sum(11); }

END {
    for (f = 1; f < 20; ++f)
        if (f in T) printf ("T%d %.2f\n", f, T[f]);
}'

관련 정보