我们正在从源系统中接收一个zip文件。这是一个.zip文件。 我们正在使用unzip命令在Linux中将其解压缩。 .zip文件包含一个.dat文件,该文件包含相同宽度的行。确切地说,这是一个固定宽度的文件。但是在解压缩时,多余的字符会添加到.dat文件中,这会导致不同行的长度有所不同。
unzip edw_ord_extr_3x_SIQP_20181021.182305.zip
这将产生edw_ord_extr_3x_SIQP_20181021.182305.dat
grep -P -n -a "[\x00-\x1F]" edw_ord_extr_3x_SIQP_20181021.182305.dat | wc -l
467
这表明按照设计,在467行中有特殊字符。 我已经在vi中打开bad.dat文件,发现特殊字符。 例如:
@^@^R^@
^A^@
<90>^@^@^@
grep -P -n -a "[\x00-\x1F]" edw_ord_extr_3x_SIQP_20181021.182305.dat > bad.dat
awk '{ print length($0) }' bad.dat | sort | uniq
2090
2091
2092
2219
2220
2221
2222
2223
2224
2225
2219是正确的长度。 这意味着,特殊字符的存在可以增加字符数或减少字符数,或者不改变字符数。
我们通过用?替换所有特殊字符来进行变通。
perl -pe 's/[\000-\011]|[\013-\037]|[\177-\377]/?/g' edw_ord_extr_3x_SIQP_20181021.182305.dat > clean.dat
到目前为止,问题已解决。
但是我需要了解为什么在执行解压缩命令时插入特殊字符? 为什么特殊字符会改变行长?我的理解是特殊字符被认为是1个字符,但在这种情况下不是。
文件详细信息。
file -bi edw_ord_extr_3x_SIQP_20181021.182305.dat
application/octet-stream; charset=binary
我已在notepad ++中打开bad.dat文件,并能够看到特殊字符,例如SOH,BEL,NUL
十六进制转储示例
000dff20 20 54 31 20 20 30 31 20 20 20 20 20 20 20 20 20 | T1 01 |
000e07d0 20 20 54 31 20 20 30 31 20 20 20 20 20 20 20 20 | T1 01 |
000e0e10 30 2e 30 30 30 30 30 30 58 5a 01 3f 00 00 00 00 |0.000000XZ.?....|
000e3340 20 30 39 30 30 20 20 54 31 20 20 30 31 20 20 20 | 0900 T1 01 |
000e4d60 31 20 20 30 31 20 20 20 20 20 20 20 20 20 20 20 |1 01 |
000e78d0 30 30 20 20 54 31 20 20 30 31 20 20 20 20 20 20 |00 T1 01 |
000e7f20 00 00 01 00 52 4f 3f 20 20 20 20 46 41 4c 4c 42 |....RO? FALLB|
000e8180 37 30 30 20 20 54 31 20 20 30 31 20 20 20 20 20 |700 T1 01 |
000e87d0 00 00 00 01 00 52 4f 3f 20 20 20 20 46 41 4c 4c |.....RO? FALL|