每2391字节添加换行

时间:2015-03-18 08:53:30

标签: linux unix

我使用的是Redhat Linux 6.

我有一个应该来自具有EBCDIC-ASCII转换的大型机MVS的文件。 (但我怀疑某些转换可能是错误的)

无论如何,我知道记录长度是2391字节。共有10条记录,文件大小为23910字节。

对于每个2391字节记录,有许多0a或0d字符(不是CRLF)。我想用#和@替换它们。

另外,我想每2391字节添加一个LF(即0.0a),以使文件成为正常的unix文本文件,以便进一步处理。

我尝试使用

dd ibs = 2391 obs = 2391 if = emyfile of = myfile.new

但是,这不起作用。两个文件都是一样的。

我也试试

dd ibs = 2391 obs = 2391 if = myfile | awk'{print $ 0}'

但是,这也行不通

有人可以为此提供帮助吗?

2 个答案:

答案 0 :(得分:2)

这样的事情:

#!/bin/bash
for i in {0..9}; do
   dd if=emyfile bs=2391 count=1 skip=$i | LC_CTYPE=C tr '\r\n' '##'
   echo
done > newfile

如果文件较长,则需要10次以上的迭代。我希望通过运行无限的looop并在出错时退出循环来处理它,如下所示:

#!/bin/bash
i=0
while :; do
   dd if=emyfile bs=2391 count=1 skip=$i | LC_CTYPE=C tr '\r\n' '##'
   [ ${PIPESTATUS[0]} -ne 0 ] && break
   echo
   ((i++))
done > newfile

但是,在我的OSX下的iMac上,dd似乎在您浏览文件末尾时因错误而退出 - 也许在您的操作系统上试试运气。

答案 1 :(得分:0)

你可以尝试

$ dd bs=2391 cbs=2391 conv=ascii,unblock if=emyfile of=myfile.new

conv=ascii从EBCDIC转换为ASCII。 conv=unblock在每个cbs大小的块的末尾插入换行符(删除尾随空格后)。

如果您已经拥有ASCII文件,并且只想在拆分块之前替换其中的某些字符,则可以使用tr(1)。例如,以下内容将使用“#”替换每个回车符,并使用“@”替换每个换行符(换行符):

$ tr '\r\n' '#@' < emyfile | dd bs=2391 cbs=2391 conv=unblock of=myfile.new