고정 크기 레코드가 있는 이진 파일의 레코드 수를 결정하는 방법 [닫기]

고정 크기 레코드가 있는 이진 파일의 레코드 수를 결정하는 방법 [닫기]

바이너리 파일의 레코드 수를 확인하려고 합니다. 바이너리 파일의 크기는 wc -c. 구분 기호를 알 수 없습니다. 레코드 크기는 고정되어 있습니다. 각 레코드의 정확한 크기를 알 수 없습니다. 레코드 수를 확인하고 싶습니다.

답변1

이 시도:

script.sh:

#!/bin/bash

# read filename to var f from $1
f="$1"
# quit if file not found.
[ -f "$f" ] || { >&2 echo "File not found." ; exit 2; }
# total length of file (-1 to not count newline at the end of a file)
n=$(($(wc -c < "$f")-1))
# loop potential length of records, end at half total length of file.
for i in $(seq 1 $(awk -v n=$n 'BEGIN{print int((n/2)+0.5)-1}')); do
    # now read all delimiters regarding record length from a file
    # (see https://unix.stackexchange.com/a/276957/236063)
    # and `sort -u` to get only individual ones
    c=$(for ((j=i;j<n;j=j+i+1)); do printf '%s\n' $(dd ibs=1 skip=$j count=1 < "$f" 2>/dev/null); done | sort -u)
    # if we have exactly one individual delimiter, we're done and can print length of record and the delimiter and exit.
    if [ $(echo "$c" | wc -l) -eq 1 ]; then
        printf 'l=%s d=%s\n' "$i" "$c"
        exit 0
    fi
done
>&2 echo "No delimiter found".
exit 1

콘텐츠 file:

abc,def,ghi

산출:

$ ./script.sh file
l=3 d=,

종료 코드:

 0 success, found delimiter and record length
 1 no delimiter found
10 file not found

참고: 특히 줄바꿈과 관련된 몇 가지 문제를 해결하려면 몇 가지 작업이 필요하다고 생각합니다...

답변2

레코드(및 구분 기호)의 정확한 크기를 알지 못하면 간단하고 우아한 솔루션으로 이 문제를 해결할 수 없습니다.

주요 경고: 구분 기호가 전혀 없거나(파일을 작성하는 소프트웨어가 레코드 크기를 알고 있는 경우 레코드를 구분 기호로 구분할 필요가 없음) 전체 파일이 하나의 레코드일 수 있으므로 이는 절박한 상황일 수 있습니다. 또한 어떤 경우에는 레코드 내에서 구분 기호로 처리되는 문자 앞에 "이스케이프 문자"가 있을 수 있습니다(고정 레코드 크기를 사용할 가능성은 없지만 구문 분석하여 상황을 더 악화시킬 수 있음). 그러나 "상황에 따라 다릅니다". 또한 바이너리 파일 형식에는 실제 녹음이 시작되기 전에 "헤더" 블록이 있을 수 있으며 이 작업을 수행하려면 해당 크기를 알아야 합니다.

그러나 희망은 거의 없습니다. 레코드의 고정 크기 길이가 결정되므로 -제목이 없다고 가정- 파일 크기( 에서 구함 wc -c)는 레코드 크기와 레코드 개수를 곱한 값이어야 합니다.

무차별 대입 방법을 시도해 볼 수 있습니다.

  1. 파일 크기 찾기 wc -c(이름을 지정 fileSize)
  2. 요인을 찾아보세요 fileSize.
  3. 파일에 맞는 가능한 모든 레코드 수를 얻을 수 있도록 모든 요소의 조합을 찾으십시오.
  4. 문자 끝에서 가능한 레코드 크기를 확인하십시오. 가상의 숫자에 동일한 문자로 끝나는 레코드가 있으면 그것이 구분 기호라고 생각할 수 있습니다.

이는 100% 완벽하지는 않지만 기록 및 문서에 대한 추가 연구에 도움이 될 것입니다.

예:

문서 내용:

abcxdefxabnxccdxdfaxaafx
  1. 파일 크기: 24바이트

  2. 인수: factors 24: 2 2 2 3

  3. 가능한 조합:

    • 2 x 12(레코드 2개, 각각 12바이트)
    • 3×8
    • 4×6
    • 6×4
    • 8×3
    • 12×2
  4. 위의 각 가능성에 대해 구분 기호가 있습니다.

    • x
    • x
    • (다르므로 이 경우는 고려하지 않음)
    • x
    • (다른)
    • (다른)
  5. 이것이 x구분 기호라고 추측할 수 있으며, 가능한 최소 레코드 크기는 상황에 맞는 4자입니다.

이것은 단지 예일 뿐입니다. 다른 가정을 시도해야 하며 파일이 큰 경우 두 개의 동일한 문자 사이의 거리를 찾는 것과 같은 다른 방법을 사용할 수 있습니다.

관련 정보