Únase a todas las demás columnas con sed o awk

Únase a todas las demás columnas con sed o awk

Tengo un archivo de texto grande (666000 columnas) en el formato

A B C D E F

Salida deseada

AB CD EF

¿Cómo podemos hacerlo en sedo awk. He probado un par de cosas pero nada parece funcionar. Por favor sugiera algo.

Respuesta1

En sed:

sed 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

Esto hará las sustituciones e imprimirá el resultado según el estándar. Para modificar el archivo en su lugar, agregue el -imodificador:

sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file

Explicación

Este sedcomando buscará un espacio, seguido de al menos un carácter que no sea un espacio, seguido de un espacio o el final de la línea. Sustituye esta secuencia con cualquier carácter que no sea espacio que encontró seguido de un solo espacio. La sustitución se aplica tantas veces como sea posible a lo largo de la línea (esto se denomina sustitución global) porque el gmodificador se proporciona al final. Entonces, básicamente, con una secuencia como A B C, sedbuscarás el patrón "B" y lo sustituirás por "B" dejándote AB Ccomo resultado final.

Supuestos hechos por este código

Este código asume que los espacios entre sus columnas son realmente espacios y no TAB, por ejemplo. Esto se puede solucionar fácilmente a expensas de la legibilidad:

sed 's![[:blank:]]\+\([^[:blank:]]\+\)\([[:blank:]]\+\|$\)!\1 !g' your_file

Respuesta2

  • mal:

    awk '{printf $1$2;for(i=3; i<=NF;i+=2){printf " %s",$i$(i+1)}print}' file 
    

    Este será probablemente el más rápido de los dos para archivos grandes.

  • Perla:

    perl -pe 's/([^\s]+)\s+([^\s]+)/$1$2/g' file
    

Respuesta3

Si su archivo realmente tiene tantas columnas, una opción es usar gawk para tratar cada columna como un registro estableciendo RS"uno o más caracteres de espacio en blanco". Esto ayuda a evitar tener que configurar un bucle a través de las columnas. Tenga en cuenta que esta solución es frágil ante un número impar de columnas en una línea.

awk --re-interval -v RS='[[:space:]]{1,}' '{x=$0; getline; printf x$0RT}' file

información relacionada