awk / sed para imprimir solo hasta el carácter de subrayado


10

¿Cómo puedo usar awk o sed para imprimir una cadena solo hasta el primer carácter de subrayado?

Antes de:

host100_044 2
host101_045 2
host102_046 2

Después:

host100
host101
host102

Respuestas:


20

Esto se puede hacer con cut:

cut -d _ -f 1

p.ej

$ echo host100_044 2 | cut -d _ -f 1
host100

También awkse puede hacer con awk -F_ '{print $1}'(probablemente haya una forma más limpia de hacerlo)


@Renan ¿Cómo modifico esta función de corte si quiero que la salida contenga toda la información de entrada además de realizar el corte?
BioMan

2

Otra alternativa para sed:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

Si los tiene en un archivo, puede llamarlo de la siguiente manera;

cat fileName | sed 's/^\(.*\)_.*$/\1/'

1
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}'  | cut -d ' ' -f2-

Salida:

host100 host101 host102

Con nuevas líneas:

echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'

Salida:

host100
host101
host102

1

Utilizando sed:

echo host100_044 2 | sed 's;_.*;;'


Usando la sedopción de edición en el lugar,

sed -i.old 's;_.*;;' infile

Simplemente estaba escribiendo lo mismo, a pesar de que la awksolución ya está publicada (y cutprobablemente sea la mejor en este caso), ya que preguntó por él sed, pero me ganaste con segundos :-). Incluso puede quitar el $, ya que coincidirá .*con el final de la línea de forma predeterminada.
Daniel Andersson

@DanielAndersson: sí.
Príncipe John Wesley

1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

Las -F'_'instrucciones awkpara utilizar guiones bajos como delimitadores de campo. El awkscript en sí solo imprime el primer campo.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.