你一定遇到过打开文件是乱码的情况,98%的时间里编码对我们来说并不重要,但是总有2%的时候由于编码问题导致了错误,不可见的特殊字符造成的错误更是令人抓狂。这里我们介绍通过三个命令(file
, hexdump
, grep
)用来检查文本的编码方式与定位特殊字符的位置。
检查文本的编码类型
file
命令可以检查文件的编码类型,我们使用生物信息的纯文本一般是由ASCII
编码的:
$ file Mus_musculus.GRCm38.75_chr1.bed Mus_musculus.GRCm38.75_chr1.gtf
Mus_musculus.GRCm38.75_chr1.bed: ASCII text
Mus_musculus.GRCm38.75_chr1.gtf: ASCII text, with very long lines
UTF-8
也是一个非常常用的编码格式,它是包括了ASCII
与非ASCII
编码的一个超集,去掉非ASCII
字符后文本就是ASCII
编码了。
$ cat utf8.txt
This file is encoded using UTF-8. This allows the use of an extended character
set, including characters like π and ¼.
$ file utf8.txt
utf8.txt: UTF-8 Unicode text
查看特殊字符位置
文件improper.fa
(如下)咋一看来是正常的fa文件:
$ cat improper.fa
>good-sequence
AGCTAGCTACTAGCAGCTACTACGAGCATCTACGGCGCGATCTACG
>bad-sequence
GATCAGGCGACATCGAGCTATCACTACGAGCGAGΑGATCAGCTATT
但是其文件类型是utf-8
,说明文本内存在特殊字符:
$ file improper.fa
improper.fa: UTF-8 Unicode text
我们该如何定位特殊字符的具体位置呢?下面介绍两种方式分别是Hexdump
与grep
:
Hexdump
这个命令会给出所有字符的16进制编码,添加-c
参数还会打印出所有的字符:
$ hexdump -c improper.fa
0000000 > g o o d - s e q u e n c e \n A
0000010 G C T A G C T A C T A G C A G C
0000020 T A C T A C G A G C A T C T A C
0000030 G G C G C G A T C T A C G \n > b
0000040 a d - s e q u e n c e \n G A T C
0000050 A G G C G A C A T C G A G C T A
0000060 T C A C T A C G A G C G A G 221
0000070 G A T C A G C T A T T \n
000007c
看出字符221
是一个特殊字符(其显示方式类似于字母A)。
grep
除了使用hexdump
外,grep
命令也可以用来寻找特殊的字符,以下命令会搜索16进制外的字符(这里参数-n
会在返回结果中给出行数):
$ LC_CTYPE=C grep --color='auto' -n -P "[\x80-\xFF]" improper.fa
4:GATCAGGCGACATCGAGCTATCACTACGAGCGAGGATCAGCTATT
由于这行代码的用途非常特殊,我们没有必要深入地探究它的原理。可以将下面的别名存入~/.bashrc
文件,在需要的时候调用。
alias nonascii="LC_CTYPE=C grep --color='auto' -n -P '[\x80-\xFF]'"
网友评论