열의 합계를 계산하려는 시나리오가 있습니다.
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]);
}'