バイナリファイルのレコード数を確認しようとしています。バイナリファイルのサイズは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
レコード(および区切り文字)の正確なサイズがわからない場合は、シンプルでエレガントなソリューションでこの問題を解決できません。
主な警告: 区切り文字がまったくない場合(ファイルを作成するソフトウェアがレコードサイズを知っている場合は、レコードを区切り文字で区切る必要はありません)、ファイル全体が1つのレコードである可能性があるため、これは切実な状況になる可能性があります。また、場合によっては、レコード内で区切り文字として扱われる文字の前に「エスケープ文字」がある場合があります(固定レコードサイズを使用する可能性はありませんが、解析して状況をさらに悪化させる可能性があります)。しかし、「状況によって異なります」。さらに、バイナリファイル形式には、実際の録音が開始される前に「ヘッダー」ブロックがある可能性があり、これを行うにはそのサイズを知る必要があります。
しかし、希望はほとんどありません。レコードの固定サイズの長さが決まるので、タイトルがないと仮定- ファイルサイズ(から取得wc -c
)は、レコードサイズとレコード数を掛けた値でなければなりません。
無差別の代入方法を試すことができます。
- ファイルサイズを探す
wc -c
(名前を指定fileSize
) - 要因を見つけてください
fileSize
。 - ファイルに収まるすべてのレコード数を取得できるように、すべての要素の組み合わせを見つけます。
- 文字の末尾で可能なレコードサイズを確認してください。仮想数字に同じ文字で終わるレコードがある場合、それは区切り文字であると考えることができます。
これは100%完璧ではありませんが、記録や文書に関するさらなる研究に役立ちます。
例:
文書の内容:
abcxdefxabnxccdxdfaxaafx
ファイルサイズ:24バイト
引数::
factors 24
2 2 2 3可能な組み合わせ:
- 2×12(レコード2個、それぞれ12バイト)
- 3×8
- 4×6
- 6×4
- 8×3
- 12×2
上記の可能性ごとに区切り記号があります。
x
x
- (異なるため、この場合は考慮しない)
x
- (その他)
- (その他)
これは
x
区切り文字であると推測できます。可能な最小レコードサイズは状況に応じて4文字です。
これは単なる例です。別の仮定を試す必要があり、ファイルが大きい場合は、2つの同じ文字間の距離を見つけるなどの他の方法を使用できます。