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