awk는 문자열과 일치하고 열 값을 합산합니다.

awk는 문자열과 일치하고 열 값을 합산합니다.

5개의 csv 파일이 포함된 폴더에서 단어를 일치시키려고 하는데 United States사용하는 명령은 행에서 단일 항목이 있는지 확인합니다. 또한 일치하는 문자열을 기반으로 다른 두 열을 합산하고 싶습니다.

awk -F "," '{if (/United States/) sum_1 += $2;sum_2 += $3} END {print sum_1, sum_2}' Files/*.csv

예, 연속으로 두 번 이상 발생하는지 확인하려고 합니다 awk.

따라서 미국과 관련된 줄이 두 번 나타나면 다음과 같이 표시되어야 합니다.

2
awk '/United States/{x++;}END{print x}' Files/*csv

샘플 파일

United States,1,2,3
Donald TRump,1,2,3
United States,1,2,3,United States

답변1

awk '/United States/ {i++} END {print i}' RS=",|\n" Files/*.csv

RS- 기본적으로 개행으로 설정되는 레코드 구분 기호를 입력합니다.

답변2

문자열 함수를 사용할 수 있습니다격자, 행당 대체 횟수를 반환합니다. 이는 각 행의 발생 횟수를 계산하는 편리한 방법이며 모든 행에 대해 이 작업을 수행할 수 있으므로 모든 행의 수를 계산할 수 있습니다.

awk '{cnt += gsub(/United States/,"&")} END {print cnt}' *.csv

awk 스크립트에서 이 검사를 사용하려면(귀하의 예에서와 같이) 다음과 같은 구문을 사용할 수 있습니다.

awk '{ if (gsub(/pattern/"&")) {"do stuff here"} }' file

또는

awk '{x = gsub(/pattern/"&"); "do stuff with x here"; }' file

grep

또한 를 사용하면 grep출력 -o에서 ​​일치하는 항목당 하나의 행을 얻고 출력 행 수가 결과입니다.

grep -o "United States" *.csv | wc -l

답변3

귀하가 제공한 예제 입력 파일을 고려하면 @nezabudka의 답변은 다음과 같습니다.

awk 'BEGIN {RS=",|\n"} /United States/ {i++} END {print i}' inputFile

맞는 것 같습니다. 그러면 다음과 같은 질문이 표시됩니다. 예제 입력 파일이 모든 필드 구분 기호를 나타내는 것이 확실합니까? 그렇지 않은 경우 다음과 같은 입력 파일 상황을 허용하는 대체 솔루션이 있습니다.

> cat inputFile
United States,1,2,3
Donald TRump,1,2,3 United States blih blah \!?# bluh  United States
United States,1,2,3,United    States

> awk 'BEGIN {RS=",|\n| "} 
       /United/ {rec=NR; next} 
       /States/ && NR==rec+1 {i++} 
       END {print i}'  inputFile
5

답변4

주문하다

    #/bin/bash

    awk '{print gsub("United States",$0)}' filename| awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'

관련 정보