일부 테스트 결과를 요약하고 있으므로 다음과 같은 유형의 텍스트가 있습니다.
FAILED src/path/to/code.test.js
Test Suite
답변1
이것은 더 많은 직업입니다 perl
.
perl -lne '
if (/^\h*at\h.*?\((src.*?\.test\.js):(\d+:\d+)\)/) {
$total{$1}++;
$lines{$1}->{$2}++
}
END {
for $file (sort {$total{$b} <=> $total{$a}} keys %total) {
my $l = $lines{$file};
print "$total{$file} $file (" .
join(", ", map "$l->{$_} - $_", sort {$l->{$b} <=> $l->{$a}} keys %$l) . ")"
}
}'
Perl 정규식 연산자의 *?
탐욕스럽지 않은 버전입니다 . 나는 그것을 지원하는 구현을 *
하나만 알고 있습니다 ( 비표준에 해당하는 구현 외에 ). 그러나 그것이 당신이 사용하고 있는 구현인 것 같습니다. 이것은 ast-open이며, 내가 아는 한 어떤 시스템에서도 기본적으로 제공되지 않습니다. 심지어 ksh93 이외의 ast-open 도구를 포함하거나 포함을 고려하는 것으로 알려진 Illumos도 마찬가지입니다. GNU 구현 (옵션을 도입한 것 ) 에서 is (0 또는 1 선행 원자)는 (0 이상의 문자)에 적용되므로 and (0 또는 1 이상의 문자)와 동일합니다.sed
-r
-E
sed
sed
-r
.*?
?
.*
.*
.+?
.*
답변2
awk '/^[[:blank:]]*at.*\(src.*\.test\.js:[0-9]+:[0-9]+\)/{
split($0, tmp, /[)(:]/) ## Assuming there is no ), ( and : in the filePath
fileCnt [tmp[2]]++
fileErrs[tmp[2], tmp[3]":"tmp[4]]++
}
END{
for (fileName in fileCnt){
sep=""
printf ("%s %s (", fileCnt[fileName], fileName)
for(file in fileErrs){
split(file, tmp, SUBSEP)
if(fileName==tmp[1]){
printf("%s - %s", sep fileErrs[file], tmp[2])
sep=", "
}
}
print ")"
}
}' infile ## or infiles*
연관된 배열은 fileCnt
파일 이름의 개수만 보유합니다. 배열의 키는 파일 이름이고 값은 해당 파일이 본 횟수입니다. 연관된
배열은 fileErrs
각 파일 이름에 대한 오류 수를 보유합니다. 여기서 키는 fileName+errNums의 조합입니다.
END 블록에서 처리 중입니다.파일 수파일 수를 배열하고 인쇄 fileCnt[fileName]
한 다음 파일 이름 자체를 fileName
처리합니다.파일 오류중요한 부분을 배열하고 분할한 다음 첫 번째 부분을 파일 이름과 비교하여 각 파일의 개별 오류를 찾습니다.
답변3
사용행복하다(이전 Perl_6)
~$ raku -ne 'state %h; state $i; ++$i; \
if m/ ^ \h* at \h .*? "(" ~ ")" [(src .*? \.test \.js) \: (\d+ \: \d+)] / \
-> { %h.push: $0 => $i ~"|"~ $1 }; END .say for %h;' file
-ne
즉, 코드는 (비자동 인쇄) 명령줄 플래그를 사용하여 입력 파일에서 한 줄씩 실행됩니다. 해시 값이 제공됩니다 %h
. $i
반복자가 선언되었습니다. 각 행마다 $i
반복자가 증가합니다. if
정규식과 일치하는 조건부 테스트비슷하지만 같지는 않다@Stephane_Chazelas가 게시한 Perl5 코드로 이동하세요. 그러나 이 Raku 정규식은 멋진(최신) 기능인 Raku의 ~
중첩된 데이터 구조 물결표 구문을 사용합니다 "(" ~ ")" [ … ]
. Raku 정규식은 경로 $0
와 콜론으로 구분된 숫자를 캡처합니다 $1
.
일치하는 항목이 한 줄씩 발견되면 해시 push
에 추가 됩니다: ( 경로)는 키로 사용되며 값은 코드를 사용하여(사용: 사용) 캡처된 숫자 부분에 연결된 줄 번호가 됩니다. 해시에는 중복 키가 존재할 수 없으므로 각 키(예: 경로)는 서로 다른 값을 누적합니다. 읽기 라인의 끝에서 해시 값이 출력됩니다.%h
$0
~
$1
$i ~"\t"~ $1
END
%h
입력 예:
#See above. OP's original file was concatenated 5 times,
#one record was altered (path and digits).
출력 예(1):
src/path/to/code.test.js => [13|31:415 27|31:415 55|31:415 69|31:415]
src/path/to/othercode.test.js => 41|32:416
개수의 선행 열을 얻으려면 뒤의 코드를 END
다음으로 바꿉니다.
for %h.kv -> $k,$v {say $v.elems, "\t", $k => $v};
출력 예(2):
4 src/path/to/code.test.js => [13|31:415 27|31:415 55|31:415 69|31:415]
1 src/path/to/othercode.test.js => 41|32:416
[참고: 해시가 관련된 경우 say
일반적으로 화살표로 구분된 출력이 생성됩니다. 위에서 간단히 최종 명령을 ]로 변경하면 key => value
탭으로 구분된 키-값 출력을 얻을 수 있습니다.say
put
https://docs.raku.org/언어/regexes#Tilde_for_nesting_structs
https://docs.raku.org/언어/hashmap
https://raku.org