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.NF
es 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 (dondeNF
se disminuye) solo ocurre siNF
no es 0.La segunda parte (ya sea
NF-=1
NF--
o--NF
) está restando uno de laNF
variable. Esto evita que se imprima el último campo, porque cuando cambia un campo (eliminando el último campo en este caso),awk
reconstruya$0
, concatene todos los campos separados por espacio de forma predeterminada.$0
ya 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 unaawk
expresión se evalúa como verdadera sin ninguna acción asociada, laawk
acción predeterminada esprint $0
.fuente
--
. Una nota, actualmente, necesita;1
para POSIX compatible.,
sea su delimitador:awk -F',' 'BEGIN { OFS = FS }; NF { NF -= 1 }; 1' < in > out
Utilizando
grep
con 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
head
simplemente la primera línea de su archivo de entrada, contar los delimitadores (n
delimitadores significa que el número de campos esn+1
) y luego usarcut
para imprimir desde el1
campo st hasta eln
campo 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
cut
que 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,D
baje a la siguiente líneaj
y detener la grabación de macro conq
.Ahora podemos repetir nuestra macro con
@q
cada 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
awk
método preservará el separador de campo correctamente:fuente