Tengo un archivo de texto grande que es básicamente una secuencia de datos comprimidos en conjunto para cada fila. Me han pedido que analice el fallo de ciertos datos en algunas columnas. Los datos no están delimitados de ninguna manera. Sin embargo, tengo una lista de longitudes de "columna" y comentarios sobre si hay datos relevantes en cada "columna".
Usaría Excel, pero el límite de Excel para delimitar por columnas está restringido a 1000 caracteres por fila, y cada fila va mucho más allá de esto. Varios de estos campos tienen cadenas de 30 espacios que actúan como relleno y hay al menos unos 15 de estos ... Espero analizar estos campos designados "vacíos".
Lo que necesito es una forma en que pueda alimentar mi archivo y con una matriz que pueda proporcionar que tenga las longitudes de columna y tal vez un marcador como "X" para ignorar las columnas respectivas que quiero ignorar, hacer que escupe un nuevo archivo con delimitadores, que luego puedo alimentar a Excel para su análisis.
Por ejemplo, si tuviera un archivo con una fila como aaaaaabbbbbccccdddddeeeffffff
y alimente este archivo con una matriz [6 5 4X 5 3X 6]
, escupiría un archivo con aaaaaa^bbbbb^ddddd^ffffff
esa fila.
¿Hay alguna manera esto se puede hacer con grep
, awk
o sed
?
Gracias por adelantado.
fuente
^
ser el delimitador exacto en las filas resultantes?Respuestas:
Si tiene GNU awk, puede especificar anchos de campo explícitos, por ejemplo
A partir de la versión 4.2, puede omitir caracteres utilizando una
n:m
sintaxis, por ejemplo(el
$1=$
justo fuerza la reevaluación de$0
con los anchos de campo especificados).Consulte, por ejemplo, la Guía del usuario de GNU Awk: 4.6 Lectura de datos de ancho fijo
fuente
cut
Enfoque de comando corto :input.txt
Contenido de muestra :El trabajo:
-c
- para seleccionar solo personajes1-6,7-11,16-20,24-29
- rangos consecutivos de posiciones de personajes, ajustables de forma flexible--output-delimiter=^
- delimitador de campo de salida, puede ajustarlo a lo que quieraLa salida:
fuente
-c 1-6,7-12,17-22,26-31
no coinciden con la salida, por ejemplo, con los números de la primera línea de salida sería:aaaaaa^bbbbbc^ddddee^ffff
.Es difícil de decir sin ver su entrada exacta y la salida deseada, pero ...
No probado Sin errores, lo prometo. ;)
Bien, lo probé. Me faltaba la llave final
END
. No hay otros errores. Funciona perfectamente en entrada de ejemplo. Salida es:fuente
Con
sed
, uno podría escribir (usando_
como delimitador):Pero esto significa resumir las posiciones absolutas de los anchos de columna. Para usar directamente los anchos, necesitamos un escape feo para la sustitución del comando:
fuente
Versión mejorada de la
cut
respuesta de RomanPerekhrest , con analizador de matriz de columnas, que incluyeX
sufijos para mostrar cuántas columnas omitir.Cargue la matriz
$n
y realice una función para analizar la matriz en números paracut -c
:El archivo input.txt contiene:
Usar
col_array()
concut
:Salida:
No hay una necesidad estricta de una matriz, ya que
col_array()
analiza sus parámetros:Salida:
fuente