awk / sed для печати только до символа подчеркивания

10

Как я могу использовать awk или sed для печати строки только до первого символа подчеркивания?

Перед:

host100_044 2
host101_045 2
host102_046 2

После:

host100
host101
host102
Rubstr
источник

Ответы:

20

Это можно сделать с помощью cut:

cut -d _ -f 1

например

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

Также с awkможет быть сделано с awk -F_ '{print $1}'(вероятно, есть более чистый способ сделать это)

Ренан
источник
@Renan Как мне изменить эту функцию вырезания, если я хочу, чтобы вывод содержал всю входную информацию в дополнение к выполнению вырезания?
BioMan
2

Еще одна альтернатива для sed:

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

Если у вас есть это в файле, вы можете назвать это следующим образом;

cat fileName | sed 's/^\(.*\)_.*$/\1/'
scriptmonster
источник
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-

Вывод:

host100 host101 host102

С символами новой строки:

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

Вывод:

host100
host101
host102
jftuga
источник
1

Использование sed:

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


Используя sedвариант редактирования на месте,

sed -i.old 's;_.*;;' infile
Принц Джон Уэсли
источник
Просто писал то же самое, хотя awkрешение уже опубликовано (и cut, вероятно, лучше в этом случае), так как он спрашивал об этом sed, но вы меня опередили за секунды :-). Вы можете даже лишить $, так как это будет соответствовать .*концу строки по умолчанию.
Даниэль Андерссон
@DanielAndersson: да.
Принц Джон Уэсли
1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

В -F'_'инструктирует awkиспользовать знак подчеркивания в качестве поля разделителей. Сам awkскрипт просто печатает первое поле.

Сергей Фадеев
источник
0

Это напечатает вывод до _:

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

y.kashyap007
источник