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
Rubstr
fuente

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
fuente
@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/'
scriptmonster
fuente
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
jftuga
fuente
1

Utilizando sed:

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


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

sed -i.old 's;_.*;;' infile
Príncipe John Wesley
fuente
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.

Sergey Fadeev
fuente
0

Esto imprimirá la salida antes de _:

sed 's/_.*//' -filename

y.kashyap007
fuente