awk를 사용하여 다른 열의 값을 기반으로 열의 값을 합산합니다.

awk. “smiths”의 열 3 만 합산하여 총 212 개를 얻습니다. “smiths”뿐만 아니라 awk를 사용하여 전체 열을 합산 할 수 있습니다. 나는 가지고있다 :

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 

답변

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

여기서는 정규식을 실제로 사용하지 않기 때문에 특정 값만 사용하면됩니다. 사용 :

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

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

댓글

  • 그런데 제가 가장 좋아하는 awk 참조는 grymoire.com/Unix/Awk.html 입니다. 매우 유용한 페이지 .
  • @Wildcard 감사합니다! 귀하의 조언에 따라 큰 zip 아카이브에서 특정 파일의 압축되지 않은 크기를 깔끔하게 집계 할 수있었습니다. 🙂

Answer

또 다른 접근 방식은 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 

댓글

  • 정답입니다.

답변

지금까지 매우 좋습니다. 합계를 추가하기 위해 블록 앞에 선택기를 추가하기 만하면됩니다. 여기에서 첫 번째 인수에 “smiths”만 포함되어 있는지 확인합니다.

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

필드 구분 기호를 옵션으로 지정하여이 값을 약간 줄일 수 있습니다. awk에서는 일반적으로 명령 줄에서 변수를 초기화하는 것이 좋습니다.

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

답변

저는 개인적으로 awk 섹션을 가능한 한 단순하게 유지하고이 섹션없이 최대한 많은 작업을 수행하고 싶습니다. . 결합 된 로직은 “유닉스 파이프 라인의 힘을 활용하지 않으므로 밀접하게 관련된 사용 사례를 이해, 디버그 또는 수정하기가 더 어렵습니다.

cat filename.txt | perl -pe "s{.*|}{}g" | awk "{sum+=$1} END {print sum}" 

Answer

cat filename.txt | grep smiths | awk -F "|" "{sum+=$NF} END {print sum}" 
  • -F 옵션으로 구분 기호 지정 .
  • $NF는 “마지막 열”입니다.

댓글

  • catgrep는 여기서 불필요합니다.
  • 왜 @Andrey가 grep이 필요하지 않습니까? OP는 " smiths " 행만 추가하려고합니다. ' awk 문을 수정해야하나요?
  • @EL 예, awk 문을 /smiths/{...} grep 호출이없는 경우. 이것은 사소한 수정이지만 상당한 이점을 제공합니다. 실행중인 프로세스 수를 줄이고 오류 제어를 단순화하며 코드를 더 명확하게 만듭니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다