shell - todas - excluir columna consulta sql
Mostrar todos los campos excepto el Ășltimo (4)
Ambas soluciones sed
y awk
funcionan independientemente del número de campos.
Usando sed
:
$ sed -r ''s/(.*)/..*//1/'' file
1.2.3.4
sanma.nam
c.d.b
Nota: -r
es la bandera para la expresión regular extendida, podría ser -E
así que verifique con man sed
. Si su versión de sed
no tiene una bandera para esto, simplemente evite los corchetes:
sed ''s//(.*/)/..*//1/'' file
1.2.3.4
sanma.nam
c.d.b
La solución sed
está haciendo un juego codicioso hasta el final .
y capturando todo lo anterior, reemplaza toda la línea con solo la parte correspondiente ( n-1
campos). Use la opción -i
si desea que los cambios se vuelvan a guardar en los archivos.
Usando awk
:
$ awk ''BEGIN{FS=OFS="."}{NF--; print}'' file
1.2.3.4
sanma.nam
c.d.b
La solución awk
simplemente imprime n-1
campos, para almacenar los cambios de nuevo en la redirección de uso del archivo:
$ awk ''BEGIN{FS=OFS="."}{NF--; print}'' file > tmp && mv tmp file
Tengo un archivo como se muestra a continuación
1.2.3.4.ask
sanma.nam.sam
c.d.b.test
Quiero eliminar el último campo de cada línea, el delimitador es .
y la cantidad de campos no es constante.
¿Alguien puede ayudarme con un awk
o sed
para descubrir la solución? No puedo usar perl
aquí.
Con cut
en la cuerda invertida
cat youFile | rev |cut -d "." -f 2- | rev
Reverso, corte, retroceso atrás.
rev file | cut -d. -f2- | rev >newfile
O bien, reemplace desde el último punto hasta el final sin nada:
sed ''s//.[^.]*$//'' file >newfile
La expresión regular [^.]
Coincide con un carácter que no es punto (o nueva línea). Debe excluir el punto porque el operador de repetición *
es "codicioso"; seleccionará la coincidencia más a la izquierda, la más larga posible.
Si quieres mantener el "." usar a continuación:
awk ''{gsub(/[^/.]*$/,"");print}'' your_file