Tengo un archivo con columnas. Vea a continuación un ejemplo:
a b c ... z
1 2 3 ... 26
Me gustaría intercambiar todas las columnas donde la primera se convierte en la última, la segunda se convierte en la anterior a la última ... etc.
z y x ... a
26 25 24 ... 1
¿Hay un revestimiento ( awk
o sed
) que hace esto?
Sé que se puede usar awk
cuando solo hay un par de columnas, pero me gustaría poder hacerlo en archivos con miles de columnas.
tac
hace esto perfectamente para líneas.
Supongo que estoy buscando el equivalente para columnas.
rev
no me ha funcionado, ya que también intercambia contenido en la columna.
text-processing
sed
awk
columns
usuario22519
fuente
fuente
perl -lane 'print join " ", reverse @F'
Respuestas:
fuente
Podrías hacerlo con un pequeño script de Python:
fuente
Si no le importa Python, esta línea invertida invertirá el orden de las columnas separadas por espacios en cada línea:
Lo anterior también funciona con python2.7:
fuente
Una forma de usar
awk
.Contenido de
infile
:Ejecute el siguiente
awk
comando:Con el siguiente resultado:
fuente
Esto es lento, pero tiene una función de canje. Mantiene el ancho de los separadores de campo, cuando son más anchos que un solo carácter. FWIW: Si ejecuta este script dos veces, el resultado es idéntico al original.
Aquí está el guión.
Aquí hay algunas comparaciones de tiempo. El archivo de prueba contenía 1 línea.
fuente
Usted puede usar
tac
sólo tiene que transponer la entrada de antes y después. Esto se puede hacer con la calculadora de hoja de cálculosc
y su compinchepsc
:Como se ve aquí .
Esto funciona mejor cuando todas las columnas están llenas.
en archivo
outfile
Editar
Como señaló PeterO,
sc
tiene un límite estricto de 702 columnas, por lo que ese es el tamaño máximo admitido por este método.fuente
1
->1.00
. Además, obtengo errores para líneas de más de 702 campos de ancho. Parece estar relacionado con un límite numérico de 32768 ... pero es bastante rápido, también.-S
alpsc
comando debería interpretar todo como cadenas. Con respecto al límite de columna 702, ese es un límite difícil porque solo se admiten columnas A a ZZ (26 + 26 * 26), agregaré un comentario al respecto.Esta tubería es más rápida que la otra respuesta más rápida por un factor significativo (ver resultados). Utiliza
tr
ytac
. Necesita utilizar 2 bytes ASCII (\ x00- \ x7F) que no existen en sus datos.\x00
Por lo general, es una buena opción,\x01
pero puede usar cualquier byte ASCII que no esté en los datos.En este ejemplo, ESPACIO y TAB como delimitadores de caracteres. Los delimitadores pueden ser de varios bytes o simples. El delimitador de salida es un espacio único.
Aquí está el comando. El nombre del archivo muestra el
numberof fields
_xnumber of lines
Si desea / necesita verificar los bytes no utilizados, puede verificar de antemano con este
awk
script opcional . El tiempo total, incluso cuando se ejecuta este script opcional, sigue siendo significativamente más rápido que otros métodos (hasta ahora :) .. Aquí está el script de preprocesamiento.Este es el script awk:
char-ascii-not-in-stream
El segundo conjunto de tiempos, para este script, incluye
char-ascii-not-in-stream
el tiempo de.fuente
También puedes hacerlo sin imprimir f :
fuente