awk / sed pour imprimer uniquement jusqu'au caractère de soulignement

10

Comment puis-je utiliser awk ou sed pour imprimer une chaîne uniquement jusqu'au premier caractère de soulignement?

Avant:

host100_044 2
host101_045 2
host102_046 2

Après:

host100
host101
host102
Rubstr
la source

Réponses:

20

Cela peut être fait avec cut:

cut -d _ -f 1

par exemple

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

Aussi avec awkpeut être fait avec awk -F_ '{print $1}'(il y a probablement une façon plus propre de le faire)

Renan
la source
@Renan Comment puis-je modifier cette fonction de coupe si je veux que la sortie contienne toutes les informations d'entrée en plus d'effectuer la coupe?
BioMan
2

Une autre alternative pour sed:

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

Si vous les avez dans un fichier, vous pouvez l'appeler comme suit;

cat fileName | sed 's/^\(.*\)_.*$/\1/'
scriptmonster
la source
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-

Production:

host100 host101 host102

Avec les nouvelles lignes:

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

Production:

host100
host101
host102
jftuga
la source
1

En utilisant sed:

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


En utilisant l' sedoption d'édition sur place,

sed -i.old 's;_.*;;' infile
Prince John Wesley
la source
J'écrivais juste la même chose, même si la awksolution est déjà publiée (et cutest probablement la meilleure dans ce cas), car il m'a posé des questions sed, mais vous m'avez battu avec quelques secondes :-). Vous pouvez même supprimer le $, car il correspondra .*à la fin de la ligne par défaut.
Daniel Andersson
@DanielAndersson: oui.
Prince John Wesley
1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

Le -F'_'demande awkd'utiliser des traits de soulignement comme délimiteurs de champ. Le awkscript lui-même imprime simplement le premier champ.

Sergey Fadeev
la source
0

Cela imprimera la sortie avant _:

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

y.kashyap007
la source