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 aaaaaabbbbbccccdddddeeeffffffy alimente este archivo con una matriz [6 5 4X 5 3X 6], escupiría un archivo con aaaaaa^bbbbb^ddddd^ffffffesa fila.
¿Hay alguna manera esto se puede hacer con grep, awko 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:msintaxis, por ejemplo(el
$1=$justo fuerza la reevaluación de$0con 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
cutEnfoque de comando corto :input.txtContenido 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-31no 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
cutrespuesta de RomanPerekhrest , con analizador de matriz de columnas, que incluyeXsufijos para mostrar cuántas columnas omitir.Cargue la matriz
$ny 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