更改大文件中的标题而不重写整个文件

时间:2014-12-03 07:24:21

标签: bash sed header dd

我遇到了大量数据文件的问题。这些文件的标题数为79行。在这些行之后,数据是二进制的。我想通过bash脚本更改标题。我用sed直到现在。问题是,当我只想更改标题时,要么读取和写入整个数据文件(1),要么在79行(2)之后中止进程。我需要改变8行的标题。因此,我提到这个问题的命令是:

(1)

sed -i  '1,79 s/ConverterPositionM2C1='"$M2C1"'/ConverterPositionM2C1='"$M2C1N"'/' $FileName

(2)

sed -i -e '79q' -e 's/ConverterPositionM1C2='"$M1C2"'/ConverterPositionM1C2='"$M1C2N"'/' $FileName

使用第一个命令适用于所有情况,但大文件(20GB)需要数小时。因为我想更改8行中的参数,这些参数彼此不同,所以我需要在我的脚本中放入8个这样的命令,并且脚本的执行需要更长的时间。 第二个命令仅复制标头。数据丢失了。

2 个答案:

答案 0 :(得分:3)

如果您不想重写二进制数据,那么标头的长度(以字节为单位)不得更改。您可以使用空格或零填充或任何适用于您的格式的方法来执行此操作。

第一步是创建所需的标题。你可以使用类似的东西:

sed 's/old/new/; 79q' "$FileName" >newhdr

s/old/new/替换为您需要的替换命令,但请记住,完成所有操作后,标头的长度(以字节为单位)不得更改。 79q告诉sed在读取第79行后停止。新标头将写入名为newhdr的临时文件。

如果newhdr具有您想要的表单,那么我们需要在$FileName中就地更改它。这可以使用dd完成,如下所示:

dd conv=notrunc obs=1 if=newhdr of="$NewFile"

conv=notrunct告诉dd不截断输出文件。 obs=1告诉它使用单字节块。 if指定输入文件,of指定输出文件。执行此命令后,$NewFile将在适当的位置更新。

答案 1 :(得分:0)

我被告知。在,Unix世界,你可以

echo $NEW_HEADER | cat - <(dd if=$YOUR_FILE bs=1 skip=$HEADER_SIZE_TO_STRIP)

这将读取您的文件,剥去标头的字节数,并使用新标头(包括eol)为文件添加前缀。