awk를 사용하여 다른 열의 값을 기반으로 한 열의 값 합계

awk를 사용하여 다른 열의 값을 기반으로 한 열의 값 합계

을 사용하여 열의 일부 숫자를 합산하려고 합니다 awk. "smiths"의 3열만 합산하여 총 212개를 얻고 싶습니다. awk"smiths"만 사용하는 것이 아니라 전체 열을 합산 할 수 있습니다 . 나는 가지고있다:

awk 'BEGIN {FS = "|"} ; {sum+=$3} END {print sum}' filename.txt

저도 퍼티를 사용하고 있습니다. 도움을 주셔서 감사합니다.

smiths|Login|2
olivert|Login|10
denniss|Payroll|100
smiths|Time|200
smiths|Logout|10

답변1

awk -F '|' '$1 ~ /smiths/ {sum += $3} END {print sum}' inputfilename
  • 플래그는 -F필드 구분 기호를 설정합니다. 특수 쉘 문자이기 때문에 작은따옴표로 묶었습니다.
  • 그런 다음 $1 ~ /smiths/첫 번째 필드가 정규식과 일치하는 행에만 다음 {code block}을 적용합니다 /smiths/.
  • 나머지는 코드와 동일합니다.

여기서는 실제로 정규식을 사용하지 않고 특정 값만 사용하므로 다음을 쉽게 사용할 수 있습니다.

awk -F '|' '$1 == "smiths" {sum += $3} END {print sum}' inputfilename

문자열 동등성을 확인합니다. 이는 문자열의 시작 부분(필드 1의 시작 부분)에만 일치하는 앵커와 문자열의 끝 부분에만 일치하는 앵커를 /^smiths$/포함하는 다른 답변에서 언급한 것처럼 regex를 사용하는 것과 같습니다 . 정규식에 얼마나 익숙한지 잘 모르겠습니다. 이는 매우 강력하지만 이 경우 문자열 동등 검사를 쉽게 사용할 수 있습니다.^$

답변2

또 다른 방법은 awk 연관 배열을 사용하는 것입니다. 추가 정보여기. 이 줄은 원하는 출력을 생성합니다.

awk -F '|' '{a[$1] += $3} END{print a["smiths"]}' filename.txt

부작용으로 이 배열은 다른 모든 값을 저장합니다.

awk -F '|' '{a[$1] += $3} END{for (i in a) print i, a[i]}' filename.txt

산출:

smiths 212
denniss 100
olivert 10

답변3

여태까지는 그런대로 잘됐다. 합계를 추가하려면 블록 앞에 선택기를 추가하기만 하면 됩니다. 여기서는 첫 번째 매개변수에 "smiths"만 포함되어 있는지 확인합니다.

awk 'BEGIN {FS = "|"} ; $1 ~ /^smiths$/ {sum+=$3} END {print sum}'

필드 구분 기호를 옵션으로 지정하면 이 프로세스를 단축할 수 있습니다. awk일반적으로 명령줄에서 변수를 초기화하는 것이 좋습니다.

awk -F'|' '$1 ~ /^smiths$/ {sum+=$3} END {print sum}'

답변4

cat filename.txt | grep smiths | awk -F '|' '{sum+=$NF} END {print sum}'
  • -F구분자를 지정하는 옵션입니다.
  • $NF"마지막 열"에 사용됩니다.

관련 정보