내 Ubuntu 컴퓨터에는 여러 성경 책과 성구를 참조하는 여러 문서가 있습니다. 책 제목, 장 번호, 하나 이상의 구절을 표시하는 목록을 만들고 싶습니다. 문서의 일반적인 항목은 Matt 12:1
또는 입니다 John 9: 4-9
.
가능하다면 목록에는 Matt 12:1
페이지 번호와 문서에서 해당 페이지가 발견된 횟수가 포함되어야 합니다. 모든 단어 목록이 포함된 txt 파일을 생성하는 스크립트가 있습니다. 한 번도 사용해본 적이 없어서 grep
완전히 감을 잃었습니다.
단어 목록에 대해 제가 수행한 작업은 다음과 같습니다.
cat exported.txt | grep -o -E '\w+' | tr '[A-Z]' '[a-z]' | sort | uniq -c >preconcordance.txt
몇 가지 예가 포함된 스니펫:
성경은 그들이 예루살렘 사람들이었고(요한복음 6:43-47, 이사야 54:11, 13), 이 아들들이 하나님을 섬겼다고 알려줍니다(말라기 3:17-18). 이 두 도시는 영원한 불로 죽음을 당하는 사람들에게 일어날 일의 예입니다. 베드로는 다음과 같이 썼습니다: 베드로후서 2:6…무저갱은 모든 귀신 중에 가장 사악한 자가 갇힌 곳입니다 (베드로후서 2:4, 유다서 1:6, 요한계시록 9:1). 이 감금 장소에 대한 더 자세한 설명을 보려면 누가복음 8:31을 참조하고 이 귀신들을 무저갱으로 보내는 그리스도의 능력에 주목하십시오.
편집하다
내 질문을 바꿔 말하면: 괄호 안의 텍스트와 숫자를 찾는 것이 가능합니까? 내 책 제목의 장과 참조 구절이 모두 (2Pet 1:2-3)
. 이 시점에서 완전히 내 리그에서 벗어났습니다.
답변1
사용행복하다(이전 Perl_6)
raku -e 'my @a = slurp.split(". "); my @b = @a.match(:global, / "(" ~ ")" .+? / ).join; \
@b.=split(/ \,\s* || <[()]> /, :skip-empty); .say for @b.map(*.tc).Bag.sort(-*.value);'
입력 예(OP의 첫 번째 참조는 복사되었으며 소문자임):
The Scriptures reveal it's the sons of Jerusalem (John 6:43-47, Isa 54:11, 13), (john 6:43-47), and it's these sons who serve God (Mal 3:17-18). and These two cities are examples of what happens to those who suffer death by eternal fire. Peter wrote: 2Pet 2:6 .. The ABYSS is where the most wicked of all demons are imprisoned (2Pet 2:4, Jude 1:6, Rev 9:1). For a further explanation of this place of restraint, see Luke 8:31, and note that Christ had the power to send these demons to the ABYSS.
예제 출력:
John 6:43-47 => 2
Jude 1:6 => 1
Rev 9:1 => 1
Isa 54:11 => 1
Mal 3:17-18 => 1
13 => 1
2Pet 2:4 => 1
Raku는 Perl 프로그래밍 언어 제품군에 속하며 여기서는 좋은 선택입니다. 특히 그리스어나 그리스어와 같은 유니코드 텍스트로 작업하려는 경우 더욱 그렇습니다.헤브라이 사람문자(Raku는 기본적으로 유니코드를 처리합니다).
즉, 파일은 " " 마침표 공간에 slurp
ed(한 번에 모두 읽기) 및 (파괴적으로) 텍스트를 문장으로 나누는 것입니다. 이러한 요소는 배열 에 저장됩니다 . 두 번째 명령문에서는 배열이 정규 표현식 에 대해 테스트됩니다. 이는 Raku가 괄호가 있는 텍스트를 찾는 방법입니다( 정규 표현식도 작동하지만 다음 참고 사항을 참조하세요).split
.
@a
@a
match
"(" ~ ")" .+?
"(" .+? ")"
중첩된 구조). 이러한 일치 항목은 join
편집되고(기본적으로 빈 요소 제거) 배열에 할당됩니다 @b
.
세 번째 문에서 대괄호 안의 텍스트는 다시 (파괴적으로) 입니다 split
. 이번에는 쉼표 다음에 선택적 공백이 오거나 \,\s*
... 태그를 사용하여 생성되고 또는 로 구성된 <[()]>
사용자 정의 문자 클래스입니다 . 이 예에서 사용하면 공백 요소가 제거됩니다. 이 결과는 배열에 다시 할당됩니다(예, 구문 설탕).<[
]>
(
)
split(… , :skip-empty)
.=
@b
@b.=split(…)
@b = @b.split(…)
마지막으로 네 번째 명령문에서 map(*.tc)
요소는 @b
제목 케이스인 -ged로 변환됩니다 Bag
(참조:여기), (값 감소)에 의해 sort
편집됩니다 -*.value
. 출력은 .say for
다음을 사용하여 한 줄씩 생성됩니다.
키와 값을 교환하고 출력 열을 전환(및 정렬 순서)하는 것은 매우 쉽습니다. 끝 부분을 변경하여 .say
출력에서 화살표를 제거하고 .put
탭 공백으로 구분된 두 개의 열을 남겨 둡니다.=>
\t