我使用的是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}'
但是,这也行不通
有人可以为此提供帮助吗?
答案 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