1

我有一个 100M 行文件,它有一些编码问题——“最初”是 EBCDIC,保存为 US-ASCII,现在是 UTF-8。我对它的传统了解不多,抱歉——我刚刚被要求分析内容。

EBCDIC 中的“cents”字符在此文件中随机“隐藏”,导致各种错误。这是关于这个臭虫的更多信息:十六进制中的美分字符

使用 iconv -f foo -t UTF-8 -c 转换此文件不起作用 - 美分字符占优势。

当我使用十六进制编辑器时,我可以找到 0xC2 0xA2 (c2a2) 的外观。但在大文件中,这并不理想。Sed 在十六进制级别不起作用,所以...不确定 tr - 我只将它用于回车/换行。

我可以使用什么 linux 实用程序/命令在非常大的文件上合理快速地查找和删除此字符?

2部分:

 1 -- utility / command to find / count the number of these occurrences (octal \242)
 2 -- command to replace (this works  tr '\242' ' ' < source > output )

文本如何出现在我的 ubuntu 终端上:

1019EQ?IT DEPT GENERATED 

使用 xxd,它在十六进制级别的外观(侧面的 ascii 看起来与上面相同):

0000000: 3130 3139 4551 a249 5420 4445 5054 2047 454e 4552 4154 4544 0d0a 

使用 xxd,“显示 ebcdic”的外观如何——这里,只是从侧面显示 ebcdic:

......s.....&....+........

所以十六进制“a2”是罪魁祸首。我现在正在尝试 xxd -E foo | grep a2 计数实例。

为感兴趣的人添加来自 od -ctxl 而不是 xxd 的输出:

 0000000   1   0   1   9   E   Q 242   I   T       D   E   P   T       G
          31  30  31  39  45  51  a2  49  54  20  44  45  50  54  20  47
 0000020   E   N   E   R   A   T   E   D  \r  \n
          45  4e  45  52  41  54  45  44  0d  0a
4

1 回答 1

1

当您说文件已转换时,您是什么意思?您的意思是二进制文件只是从 IBM 360 转储到另一台基于 ASCII 的计算机,还是文件本身在传输时转换为 ASCII?

问题是文件是否实际上处于良好编码状态。另一个问题是您希望如何对文件进行编码?

在我的 Mac(默认情况下使用 UTF-8,就像 Linux 系统一样)上,我可以毫无问题地使用sed摆脱¢字符:

这是我的文件:

$ cat test.txt
This is a test --¢-- TEST TEST
$ od -ctx1 test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    -   ¢  **   -   -       T   E   S   T       T   E   S   T  \n
           2d  c2  a2  2d  2d  20  54  45  53  54  20  54  45  53  54  0a
0000040

您可以看到打印出该字符cat没有问题。¢而且,您可以在od转储中看到字符的c2a2编码¢

$ sed 's/¢/$/g' test.txt > new_test.txt
$ cat new_test.txt
This is a test --$-- TEST TEST
$ od -ctx1  new_test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    -   $   -   -       T   E   S   T       T   E   S   T  \n    
           2d  24  2d  2d  20  54  45  53  54  20  54  45  53  54  0a    
0000037

¢这是我的 sed 将其更改为$标志没有问题。转储现在显示此测试文件等同于严格的 ASCII 编码文件。编码的两个十六进制数字¢现在是一个很好的干净的单个十六进制数字编码$

看起来sed可以处理你的问题。

如果要在 Windows 系统上使用此文件,可以将文件转换为标准的 Windows 代码页 1252:

$ iconv -f utf8 -t cp1252 test.txt > new_test.txt 
$ cat new_test.txt 
This is a test --?-- TEST TEST
$ od -ctx1  new_test.txt
0000000    T   h   i   s       i   s       a       t   e   s   t       -
           54  68  69  73  20  69  73  20  61  20  74  65  73  74  20  2d
0000020    - 242   -   -       T   E   S   T       T   E   S   T  \n    
           2d  a2  2d  2d  20  54  45  53  54  20  54  45  53  54  0a    
0000037

这是现在在代码页 1252 中的文件,就像 Windows 喜欢它的方式一样!请注意,¢现在是一个不错的十六进制 242 字符。

那么,究竟是什么问题呢?您是否需要以纯 ASCII 定义的127 个字符归档?您是否需要对文件进行编码,以便 Windows 机器可以处理它?您在输入 ¢ 字符时遇到问题吗?

让我知道。我不是来自政府部门,但我是来帮助你的。

于 2013-07-26T23:21:31.083 回答