awk / sed, aby wydrukować tylko do znaku podkreślenia

10

Jak mogę użyć awk lub sed, aby wydrukować ciąg tylko do pierwszego znaku podkreślenia?

Przed:

host100_044 2
host101_045 2
host102_046 2

Po:

host100
host101
host102
Rubstr
źródło

Odpowiedzi:

20

Można to zrobić za pomocą cut:

cut -d _ -f 1

na przykład

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

Również awkmożna zrobić z awk -F_ '{print $1}'(prawdopodobnie istnieje sposób czystsze robi to)

Renan
źródło
@Renan Jak zmodyfikować tę funkcję cięcia, jeśli chcę, aby wyjście zawierało wszystkie informacje wejściowe oprócz wykonywania cięcia?
BioMan
2

Kolejna alternatywa dla sed:

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

Jeśli masz je w pliku, możesz wywołać go w następujący sposób;

cat fileName | sed 's/^\(.*\)_.*$/\1/'
İsmail Taha AYKAÇ
źródło
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-

Wynik:

host100 host101 host102

Z nowymi liniami:

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

Wynik:

host100
host101
host102
jftuga
źródło
1

Używanie sed:

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


Korzystanie sedz opcji edycji na miejscu,

sed -i.old 's;_.*;;' infile
Książę John Wesley
źródło
Właśnie pisałem to samo, mimo że awkrozwiązanie jest już opublikowane (i cutprawdopodobnie jest w tym przypadku najlepsze), ponieważ zapytał o sed, ale pobiłeś mnie sekundami :-). Możesz nawet usunąć $, ponieważ .*domyślnie dopasuje się do końca linii.
Daniel Andersson
@DanielAndersson: tak.
Książę John Wesley
1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

W -F'_'przesyła zlecenie awkużywać podkreślenia jako ograniczniki pól. Sam awkskrypt po prostu drukuje pierwsze pole.

Sergey Fadeev
źródło
0

Spowoduje to wydrukowanie wyniku przed _:

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

y.kashyap007
źródło