Quiero eliminar la última columna de un archivo txt, aunque no sé cuál es el número de columna. ¿Cómo podría hacer esto?
Ejemplo:
Entrada:
1223 1234 1323 ... 2222 123
1233 1234 1233 ... 3444 125
0000 5553 3455 ... 2334 222
Y quiero que mi salida sea:
1223 1234 1323 ... 2222
1233 1234 1233 ... 3444
0000 5553 3455 ... 2334
text-processing
sed
awk
perl
zara
fuente
fuente

Respuestas:
Con
awk:o:
o:
Aunque esto parece vudú, funciona. Hay tres partes en cada uno de estos comandos awk.
La primera es
NF, que es una condición previa para la segunda parte.NFes una variable que contiene el número de campos en una línea. En AWK, las cosas son ciertas si no son 0 o una cadena vacía"". Por lo tanto, la segunda parte (dondeNFse disminuye) solo ocurre siNFno es 0.La segunda parte (ya sea
NF-=1NF--o--NF) está restando uno de laNFvariable. Esto evita que se imprima el último campo, porque cuando cambia un campo (eliminando el último campo en este caso),awkreconstruya$0, concatene todos los campos separados por espacio de forma predeterminada.$0ya no contenía el último campo.La parte final es
1. No es mágico, solo se usa como una expresión que significatrue. Si unaawkexpresión se evalúa como verdadera sin ninguna acción asociada, laawkacción predeterminada esprint $0.fuente
--. Una nota, actualmente, necesita;1para POSIX compatible.,sea su delimitador:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > outUtilizando
grepcon PCRE:Usando GNU
sed:fuente
Usando Perl:
Usando
rev+cut:fuente
Usando GNU sed:
En términos más generales, este funciona con el BSD sed en OSX, así como con GNU sed:
fuente
Si el delimitador siempre es un carácter único (por lo que dos o más delimitadores consecutivos designan campos vacíos), podría
headsimplemente la primera línea de su archivo de entrada, contar los delimitadores (ndelimitadores significa que el número de campos esn+1) y luego usarcutpara imprimir desde el1campo st hasta elncampo th (penúltimo), por ejemplo, con entrada delimitada por tabulaciones:o por ejemplo con un archivo csv :
Ejecutaré algunos puntos de referencia más adelante si tengo tiempo, pero con una gran aportación, creo que esta solución debería ser más rápida que otras soluciones que usan expresiones regulares, ya que esta realiza un procesamiento mínimo en la primera línea para obtener el no. de campos y luego utiliza el
cutque está optimizado para este trabajo.fuente
Portablemente puede usar cualquiera de estos:
fuente
Usando vim:
Abrir archivo en vim
Vaya a la primera fila, en caso de que el cursor se coloque en otro lugar.
Cree una macro llamada "q"
qq, que vaya al final de la línea actual$, luego regrese al último espacioF(F mayúscula, seguido de ESPACIO literal), luego borre de la posición actual hasta el final de la línea,Dbaje a la siguiente líneajy detener la grabación de macro conq.Ahora podemos repetir nuestra macro con
@qcada línea.También podemos presionar
@@para repetir la última macro o incluso más fácil:para repetir la macro 99 veces.
Nota: El número no debe coincidir exactamente con las líneas.
fuente
Para las personas que tienen un problema similar pero con diferentes separadores de campo, este
awkmétodo preservará el separador de campo correctamente:fuente