
テキストファイルの各メガバイトに数字を追加しようとしています。
たとえば、24MBテキストファイルの場合、1048576番目(1024 * 1024)バイトを1に変更し、2097152番目(2mb to byte)バイトを2に変更したいと思います。 10mb表示(10485760番目のバイト)の場合、10485759番目のバイトに1を追加し、10485760番目のバイトに0を追加したいと思います。
私が考えたのは、awk
私が見つけたコマンドを使うことでした。オンライン、このように:
awk '$0=substr($0,1,1048575)"[some number here]"substr($0,1048577,length($0))' input.txt > output.txt
しかし、このコマンドを使用すると、 の入力を変更することはできません。[some number here]
ポインタ(または同様のもの)を特定のバイト数だけ移動し、ポインタが指すバイトを変更してポインタを再度移動する方法はありますか?
ありがとうございます。
答え1
シェルを介して検索演算子をksh93
使用すると、次のことができます。>#((...))
#! /bin/ksh93 -
LC_ALL=C
block=${1?Please specify a block size}; shift
for file do
for (( n = 1; n * block <= size; n++ )); do
printf %s "$n" >#(( n * block - ${#n} )) || break
done 1<> "$file" >#(( size = EOF ))
done
(として使用that-script 1048576 file1 file2...
)。
zsh
組み込みと同じsysseek
:
#! /bin/zsh -
zmodload zsh/system || exit
block=${1?Please specify a block size}; shift
for file do
{
sysseek -u 1 -w end 0 || continue
(( size = systell(1) ))
for (( n = 1; n * block <= size; n++ )); do
sysseek -u 1 $(( n * block - $#n )) &&
printf %s $n ||
break
done
} 1<> $file
done
bash
ファイルサイズを取得する検索演算子や演算子はありませんが、そのシェルを必ず使用する必要がある場合は、いつでもスクリプトからインタプリタを呼び出すことができます(例:ksh93
// zsh
)。perl
bash