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


63

를 사용하여 열의 특정 숫자를 합산하려고합니다 awk. 총 "212"를 얻기 위해 "smiths"의 3 열만 합산하고 싶습니다 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

답변:


81
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

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


3
그건 그렇고, 내가 좋아하는 awk 참조는 grymoire.com/Unix/Awk.html 입니다. 매우 유용한 페이지입니다.
와일드 카드

1
@Wildcard 감사합니다! 나는 당신의 조언에 따라 큰 zip 아카이브에 압축되지 않은 특정 파일의 크기를 깔끔하게 집계 할 수있었습니다 :) unzip -lv /appl/tmp/data.lar | grep documentlibrary | awk '{sum += $1} END {print sum/1024/1024}'
Pawel

15

또 다른 접근법은 awk 연관 배열을 사용하는 입니다. 자세한 내용은 here . 이 줄은 원하는 출력을 생성합니다.

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

정답입니다.
PoVa

5

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

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

필드 구분 기호를 옵션으로 지정하여이 비트를 줄일 수 있습니다. 에서 awk그것은 일반적으로 명령 행에서 변수를 초기화하는 것이 좋습니다 :

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

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

1
cat그리고 grep여기에 필요하지 않습니다.
Andrey

grep에 @Andrey가 왜 필요하지 않습니까? OP는 "스미스"행만 추가하려고합니다. awk 문을 수정해야합니까?
EL

1
@EL 예, /smiths/{...}grep 호출이 없으면 awk 문을 수정해야합니다 . 이것은 사소한 수정이지만 상당한 이점을 제공합니다. 실행중인 프로세스 수를 줄이고 오류 제어를 단순화하며 코드를 명확하게 만듭니다.
안드레이

0

개인적으로 awk섹션을 가능한 한 단순하게 유지하고 섹션 없이는 최대한 많이 할 수 있습니다. 통합 된 논리는 Unix 파이프 라인의 장점을 활용하지 않으므로 밀접하게 관련된 사용 사례를 이해, 디버그 또는 수정하기가 더 어렵습니다.

cat filename.txt | perl -pe 's{.*|}{}g' | awk '{sum+=$1} END {print sum}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.