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