Bash: 여러 알파벳 파일에서 N 문자 계산

Bash: 여러 알파벳 파일에서 N 문자 계산

저는 N자마다 특정 수수료(예: 500,000)를 지불하는 교정자와 함께 일하고 있습니다. 그는 (보통) 알파벳 순서로 파일을 생성/편집합니다. 콘텐츠/파일 이름은 라틴어가 아닌 UTF-8입니다. 간단한 일반 텍스트 Markdown(.md) 또는 org(.org) 파일입니다.

나는 그에게 언제 지불해야 하는지 알 수 있도록 그의 "N 문자 이정표"를 직접 기록하는 효율적인 방법을 찾아야 합니다. 예를 들어, 내가 지난번에 "aab.md" 파일의 문자 기호 3036까지 그에게 돈을 지불했다고 가정해 보겠습니다. 그는 파일을 완성하고 "aac.md", "aad.md"로 이동했으며 현재는 "csdw.md"에 있습니다.

  1. 이 스트림에서 N 문자(구두점, 공백, 숫자, 줄 바꿈, 중괄호 등 모든 항목 포함)를 어떻게 "측정"합니까(모든 문자가 동일한 디렉토리에 있다고 가정)? 즉, "aab.md", 3036 및 N을 입력으로 사용하고 "csaw.md", 5023(해당 파일에 문자 끝으로 시작하는 N 문자가 있음을 의미)을 제공하는 bash 명령이 필요합니다.
  2. 이전 명령에 포함된 파일을 나열하는 방법은 무엇입니까?
  3. 이것은 그다지 중요하지 않지만 가능하다면 파일이 "a/aab.txt" 문자 파일에서 마지막으로 중지된 것처럼 파일이 여러 디렉터리(알파벳순)에 분산되어 있는 경우 #1의 명령은 어떻게 보일까요? 위와 동일합니다. md"이고 이제 "np/csdw.md"에 있습니까?

cat * | wc -m나는 그것이 나에게 모든 파일의 문자 수를 제공한다는 것을 알았지 만 내가 필요한 것과는 거리가 멀었습니다.

답변1

zsh대신 을 사용하는 것이 좋습니다 bash. 이후 새 파일의 정렬된 재귀 목록을 얻는 것이 더 쉬울 것입니다 aab.md.

#! /bin/zsh -
last_file=aab.md offset_in_last_file=3036 n=500000
new_files=(**/*.(md|org)(N))
new_files=($new_files[(Re)$last_file,-1])

(($#new_files)) && perl -Ci -sne '
   $l = length; $go += $l; $o += $l;
   if ($go >= $n) {
     printf qq(file="%s", line=%d, char-offset=%d\n), $ARGV, $., $o + $n - $go;
     exit;
   }
   $o = 0 if eof' -- -go=-$offset_in_last_file -n=$n ./$^new_files

문자 수 대신 문자소 클러스터 수 $l = length는 로 대체합니다 $l = () = /\X/g. 예를 들어 1개의 자소 클러스터 é로 쓰면 U+0065U+03012자(UTF-8에서는 3바이트)로 표현되고, U+00E9로 쓰면 1자소 클러스터와 1자(2바이트)로 표현됩니다.

bash 4.4+ 및 GNU를 사용하면 awk다음과 같은 작업을 수행하여 $new_files배열을 구성할 수 있습니다.

shopt -s nullglob extglob globstar
readarray -td '' new_files < <(
    printf '%s\0' **/*.@(md|org) |
      L=$last_file awk -v RS='\0' -v ORS='\0' '$0 == ENVIRON["L"], 0'
  )

의 경우 로도 bash바꿔야 합니다 . ( 또는,,,, 공백으로 시작하는 파일 이름과 관련된 문제를 피하기 위해 접두사를 추가합니다 ..../$^new_files"${new_files[@]/#/.\/}"./-|<>

관련 정보