csv 파일에서 필드 패턴을 찾은 다음 고유한 필드 값을 계산합니다.

csv 파일에서 필드 패턴을 찾은 다음 고유한 필드 값을 계산합니다.

Cygwin(bash)을 사용하여 여러 CSV 파일에서 필드를 찾고, 그룹화하고, 계산하는 스크립트를 만들고 있습니다. 각 행에는 쉼표로 구분된 필드가 있으며 각각 유사한 규칙을 따릅니다. 숫자 값, 등호(=), 영숫자 값 순입니다. "(숫자)="는 한 줄에 나타날 수도 있고 그렇지 않을 수도 있으며, 그럴 경우 필드 위치가 다를 수 있지만 한 줄에 한 번만 나타납니다. 또한 등호 뒤의 값 길이도 달라집니다.

내 목표의 예가 최고입니다. CSV 파일:

35=D,11=ABCD1,1=ABC,55=XYZ,38=100,40=P,18=M,54=1,59=0,10=111
35=D,11=ABCD2,1=ABC,55=XYZ,38=200,40=P,18=M,54=1,44=10.00,59=0,10=133
35=D,11=ABCD3,1=ABC,55=XYZ,38=300,40=P,18=M B,54=1,44=10.00,59=0,110=200,10=113
35=D,11=ABCD4,1=ABC,55=XYZ,38=400,40=P,18=M B F,54=1,44=10.00,59=0,110=300,10=144
35=D,11=ABCD5,1=ABC,55=ZYX,38=300,40=2,54=1,44=10.00,59=3,10=132
35=D,11=ABCD6,1=ABC,55=QQQ,38=100,40=1,18=C,54=2,59=3,10=131

"18=" 필드 값은 공백으로 구분됩니다. 각각의 고유한 "18=" 값을 식별한 다음 각 값의 발생 횟수를 계산하는 스크립트나 한 줄의 코드를 원합니다. 위 파일을 사용한 출력은 다음과 같습니다(정렬은 선택 사항).

18=M 2
18=M B 1
18=M B F 1
18=C 1

앞서 언급했듯이 이 스크립트는 이 형식의 레코드가 포함된 많은 파일을 읽어야 합니다. 나는 다양한 grep조합을 시도해 보았지만 awk올바른 구현에 익숙하지 않습니다.

처음 두 답변은 실제로 작동합니다(정말 감사합니다!). 고유한 "18=" 개수 결과별로 그룹화된 "38=" 값을 집계하도록 확장할 수 있나요?

답변1

이는 Perl에서 해시 구조를 사용하여 수행하는 것이 가장 좋습니다.

perl -nle '($x)=/(18=[^,]+)/;$y{$x}++; END{print "$_ $y{$_}" for keys %y}' files

설명하다

각 줄에 대해 Perl은 18=쉼표가 아닌 문자를 가능한 한 많이 찾아서 발견된 내용을 변수에 저장합니다 $x. 그런 다음 이 변수는 해시의 키로 사용되며 , 발견된 각 키에 대해 %y관련 값이 증가합니다.$x

가장 END(, 모든 행이 처리된 후) 18=...해시 변수의 키(필드) 및 관련 값(발생 횟수)을 인쇄합니다 %y.

답변2

이 조합을 한번 시도해 보시겠어요?

grep -ho "18=[^,]*" list_of_files | sort | uniq -c

관련 정보