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

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 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/'

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

1

En utilisant sed:

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


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

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

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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.