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 sed
o 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 -i
modificador:
sed -i 's! \([^ ]\+\)\( \|$\)!\1 !g' your_file
Explicación
Este sed
comando 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 g
modificador se proporciona al final. Entonces, básicamente, con una secuencia como A B C
, sed
buscarás el patrón "B" y lo sustituirás por "B" dejándote AB C
como 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