2015-06-22 3 views
0

Как я могу правильно разобрать этот файл через tail, без ошибок при форматировании?Ошибки форматирования с хвостом

Я использую tail в пределах cygwin, чтобы проанализировать последние десять строк из двух файлов. Один файл анализирует правильно, а другой содержит пробел между каждым символом.

$ tail file2.txt -n 4 
22/06/2015 12:28 - Decompressing and saving profile extract... 
22/06/2015 12:28 - Decompressing and saving profile extract... 
22/06/2015 12:38 - Decompressing and saving profile extract... 
22/06/2015 12:38 - Decompressing and saving profile extract... 

$ tail file1.txt -n 4 
P a c k a g e s t a r t . 
E l a p s e d t i m e : 5 0 . 1 7 5 7 5 4 8 s e c s . 
. . . P a c k a g e E x e c u t e d . 

R e s u l t : S u c c e s s 

Когда я прочитал сырое содержимое файла в питоне я получаю folllowing, whjich Я думаю, что это нагрузка Юникода

In [1]: open('file1.text', 'r').read() 
Out[1]: '\xff\xfeP\x00a\x00c\x00k\x00a\x00g\x00e\x00 \x00s\x00t\x00a\x00r\x00t\x00.\x00\r\x00\n\x00E\x00l\x00a\x00p\x00s\x00e\x00d\x00 \x00t\x00i\x00m\x00e\x00:\x00 \x005\x000\x00.\x001\x007\x005\x007\x005\x004\x008\x00 \x00s\x00e\x00c\x00s\x00.\x00\r\x00\n\x00.\x00.\x00.\x00P\x00a\x00c\x00k\x00a\x00g\x00e\x00 \x00E\x00x\x00e\x00c\x00u\x00t\x00e\x00d\x00.\x00\r\x00\n\x00\r\x00\n\x00R\x00e\x00s\x00u\x00l\x00t\x00:\x00 \x00S\x00u\x00c\x00c\x00e\x00s\x00s\x00\r\x00\n\x00\r\x00\n\x00' 
In [2]: print open('temp.txt', 'r').read() 
■P a c k a g e s t a r t . 
E l a p s e d t i m e : 5 0 . 1 7 5 7 5 4 8 s e c s . 
. . . P a c k a g e E x e c u t e d . 

R e s u l t : S u c c e s s 

Когда я скопировать все содержимое file1.txt в новый файл test.txt - вопрос не повторяется.

$ tail test.txt 
Package start. 
Elapsed time: 50.1757548 secs. 
...Package Executed. 

Result: Success 

файл, кажется, есть символы \x00 между каждым символом и \xff на старте.

ответ

1

Файл находится в формате UTF-16, который использует 2 8-разрядных байта для представления большинства символов (и 4 8-битных байта для некоторых символов). Каждый из 128 символов ASCII представлен как 2 байта, нулевой байт и байт, содержащий фактическое значение символа. Последовательность \xff\xfe в начале представляет собой знак порядка байтов (BOM); он указывает, будут ли остальные символы представлены сначала с байтом высокого или младшего порядка.

UTF-16 является одним из нескольких способов представления текста в Юникоде. Это чаще всего используется в Microsoft Windows.

Я не уверен, почему нулевые символы отображаются как пробелы. Это может быть связано с тем, как ведет себя ваш эмулятор терминала.

Используйте команду iconv, чтобы преобразовать файл из UTF-16 в другой формат.

+0

Вы правы, 'file file1.txt' дал:' Юникод-текст Юникода Юникода, с терминаторами линии CRLF' –

+0

можно ли 'iconv' на лету при использовании' tail -f '? –

+0

'$ luit -encoding UTF-8 tail -f file1.txt' решил это для меня. –