una todas menos las excluir excepto consulta columnas columna shell sed awk solaris

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