Extrayendo el encabezado de "texto sin formato" del archivo HEX usando Perl

Tengo un archivo que parece tener encabezados de texto sin formato que me gustaría extraer y convertir a texto sin formato.

Usando HEXedit, esto es lo que estoy viendo, que está en un archivo:

3a40 - 31 65 33 38 00 00 00 00 00 00 00 00 00 00 00 00 - 1e38............
3a50 - 00 00 00 00 00 00 00 00 00 00 0a 00 74 00 65 00 - ............t.e.
3a60 - 78 00 74 00 2f 00 61 00 73 00 63 00 69 00 69 00 - x.t./.a.s.c.i.i.
3a70 - 00 00 18 00 61 00 66 00 66 00 79 00 6d 00 65 00 - ....a.f.f.y.m.e
3a80 - 74 00 72 00 69 00 78 00 2d 00 61 00 72 00 72 00 - t.r.i.x.-.a.r.r
3a90 - 61 00 79 00 2d 00 62 00 61 00 72 00 63 00 6f 00 - a.y.-.b.a.r.c.o.
3aa0 - 64 00 65 00 00 00 64 00 40 00 35 00 32 00 30 00 - d.e...d.@.5.2.0.
3ab0 - 38 00 32 00 36 00 30 00 30 00 39 00 31 00 30 00 - 8.2.6.0.0.9.1.0.
3ac0 - 37 00 30 00 36 00 31 00 31 00 31 00 38 00 31 00 - 7.0.6.1.1.1.8.1.
3ad0 - 31 00 34 00 31 00 32 00 31 00 33 00 34 00 35 00 - 1.4.1.2.1.3.4.5.
3ae0 - 35 00 30 00 39 00 38 00 39 00 00 00 00 00 00 00 - 5.0.9.8.9.......
3af0 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - ................
3b00 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 00 - ................

y esta es la salida que me gustaría obtener:

text/ascii  affymetrix-array-barcode d@52082600910706111811412134550989

preguntado el 10 de mayo de 11 a las 13:05

¿Qué tipo de archivo es? -

@Christoffer Hammarström: stat.lsa.umich.edu/~kshedden/Courses/Stat545/Notes/… - aunque en las especificaciones no veo los datos que veo en el archivo; ese es el código de barras. ¿Por qué preguntas? -

Para ver si ya hay un analizador para él, y para ver si hay problemas que debe tener en cuenta, como señaló @PacoRG. -

3 Respuestas

Prueba con el iconv mando. Algo como esto debería funcionar:

tail -c +6 input.txt | iconv -f UTF16 -t ASCII >output.txt

Luego divida en los bytes nulos.

contestado el 10 de mayo de 11 a las 19:05

@PacoRG: Gracias, acabo de ejecutar iconv y devolvió este error: "iconv: secuencia de entrada ilegal en la posición 0"; Si cambio UTF16 a UTF8, la posición del error cambia a 428; la versión de iconv es "iconv (GNU libc) 2.5" - ¿alguna sugerencia? ¡Gracias! - errores

Creo que necesitas eliminar manualmente los primeros 4 bytes de tu archivo. - Francisco R

@PacoRG: No estoy seguro de cómo eliminar manualmente 4bytes, además la solución no puede ser manual, ya que es parte de un script. - errores

cut -c4- input.txt |iconv -f UTF16 -t ASCII >output.txt - Francisco R

Ups, no noté que su captura de edición hexadecimal comienza en 3a40 (14912). Prueba esto: cut -c14928- |iconv -f UTF16 -t ASCII >output.txt. Por cierto, desde el enlace que agregó, veo que el formato de archivo CEL es complejo. iconv solo puede ayudarlo a extraer algunas cadenas de una manera rápida y sucia, pero nada más. - Francisco R

De acuerdo, no soy un genio, pero esto funciona si todos sus archivos se parecen mucho al que acaba de publicar:

use strict;
open FILE, 'file.dat';
binmode FILE;
my ($chunk, $buf, $n);
seek FILE, 28, 0;
while (($n=read FILE, $chunk, 16)) { $buf .= $chunk; }
my @s=split(/\0\0/, $buf, 4);
print "$s[0] $s[1] $s[2]\n";
close (FILE);

contestado el 10 de mayo de 11 a las 21:05

Ejecutó el código en ptkdb (un depurador de Perl) y ver el código haciendo algo, pero nunca obtenga ninguna declaración de impresión. ¿Qué está haciendo el código y qué resultado debo esperar? ¡Gracias! - errores

@blunders Hizo un cambio: debería funcionar ahora. El resultado esperado es "text / ascii affymetrix-array-barcode d @ 52082600910706111811412134550989" - sapht

+1 @sapht: Gracias, lo hice funcionar. Aunque no está claro si el código se adaptará a mis necesidades; lo que significa que el código parece apuntar a la extracción en función de la posición, que será la misma. Lo único que sé que seguirá siendo el mismo es el HEX para "affymetrix-array-barcode" y el formato general del código de barras en sí. Supongo que creo que el contenido ASCII estaba en ASCII y que podría usar expresiones regulares para apuntar al HEX suministrado, extraerlo, convertirlo a ASCII y limpiarlo si es necesario. - errores

Una solución de Perl podría ser interesante, pero no lo haría el Unix strings comando le da la parte de texto sin formato del archivo?

contestado el 10 de mayo de 11 a las 18:05

@pavium: el código se está ejecutando en CentOS, si puede llamar a un comando del sistema y extraer la salida proporcionada de la lista de entrada con perl, sí, está bien. Dicho esto, tengo un conocimiento muy limitado de Perl y nunca he usado el comando "strings"; lo que significa que actualmente tu respuesta se parece más a un comentario para mí. ¡Gracias! - errores

@blunders, man strings debería decirle más de lo que desea saber sobre el comando. No quisiera pontificar sobre cómo hacerlo porque aquí es muy tarde y probablemente te daría un mal consejo. Mañana, como desafío, podría considerar cómo hacerlo todo en perl cuando haya descansado bien. - pavium

@pavium: ¡Genial, gracias! He estado mirando la página de manual, si encuentro una solución, volveré a comentar, ¡nuevamente gracias! - errores

@blunders, el [CAMINO ABSOLUTO] que mencionaste sí estaba la ruta al archivo binario? Lo pregunto porque en [RUTA ABSOLUTA] /string_output.txt debería ser una ruta al directorio que contiene el archivo binario. - pavium

@blunders, voté a favor de la pregunta porque parecía 'clara y útil', pero alguien la rechazó. De manera similar, alguien votó mi respuesta poco después de que la publiqué, pero también se votó en contra, probablemente porque en realidad no proporciona una solución con Perl. Estoy perdiendo el entusiasmo que tenía anoche ... así que probablemente no me apresure a probar una solución Perl, especialmente ahora que parece que tiene una solución funcional de sapht. - pavium

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.