awk / sed per stampare solo fino al carattere di sottolineatura


10

Come posso usare awk o sed per stampare una stringa solo fino al primo carattere di sottolineatura?

Prima:

host100_044 2
host101_045 2
host102_046 2

Dopo:

host100
host101
host102

Risposte:


20

Questo può essere fatto con cut:

cut -d _ -f 1

per esempio

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

Anche con awkpuò essere fatto con awk -F_ '{print $1}'(probabilmente c'è un modo più pulito di farlo)


@Renan Come posso modificare questa funzione di taglio se voglio che l'output contenga tutte le informazioni di input oltre a eseguire il taglio?
BioMan,

2

Un'altra alternativa per sed:

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

Se li hai in un file, puoi chiamarlo come segue;

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-

Produzione:

host100 host101 host102

Con le nuove linee:

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

Produzione:

host100
host101
host102

1

Utilizzando sed:

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


Utilizzando l' sedopzione di modifica sul posto,

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

Stavo scrivendo lo stesso, anche se la awksoluzione è già stata pubblicata (ed cutè probabilmente la migliore in questo caso), dal momento che mi ha chiesto sed, ma mi hai battuto in pochi secondi :-). Puoi anche eliminare il simbolo $, poiché .*per impostazione predefinita corrisponderà alla fine della riga.
Daniel Andersson,

@DanielAndersson: si.
Prince John Wesley,

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

I -F'_'incarica awkdi utilizzare underscore come delimitatori di campo. Lo awkscript stesso stampa solo il primo campo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.