我正在尝试为文本文件的每兆字节添加一个数字。
例如,对于24MB的文本文件,我想将第1048576(1024*1024)字节更改为1,将第2097152(2mb至字节)字节更改为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
shell 使用其>#((...))
查找运算符,您可以执行以下操作:
#! /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
没有查找运算符,也没有任何运算符来获取文件的大小,但如果您确实必须使用该 shell,您始终可以在脚本中调用解释器(例如ksh93
// zsh
) 。perl
bash