Використовуючи sed / awk, щоб видалити що-небудь після першого пробілу


20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Використовуючи sed / awk / substitu, у вищенаведеному тексті я хочу видалити все, що з’явиться після першого пробілу у кожному рядку. Наприклад, вихід буде:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

будь-яка допомога буде вдячна.

Відповіді:


35

Сед

sed 's/\s.*$//'

Греп

grep -o '^\S*'

Awk

awk '{print $1}'

Як зазначено в коментарях, -oце не POSIX; однак і GNU, і BSD мають його, тому він повинен працювати для більшості людей.

Також \s/ \Sможе бути не у всіх системах, якщо ваша не розпізнає це, ви можете використовувати буквальний пробіл, або якщо ви хочете пробіл та вкладку, ті, які містяться в дужці виразом ( [...]), або [[:blank:]]клас символів (зауважте, що строго кажучи \sце еквівалентний [[:space:]]і включає символи вертикального проміжку, а також CR, LF або VT, які вам, мабуть, не цікаві).

awk Один передбачає , що лінії не починаються з пропуском.


14
cut -d ' ' -f 1 < your-file

було б найбільш ефективним.


4
Я помітив це в декількох ваших відповідях, і мені було цікаво, чи є причина в цьому: ви, здається, завжди додаєте перенаправлення вводу, навіть коли команда може працювати без нього. Чи можете ви поясніть, чому <корисне тут?
Джозеф Р.

5
@JosephR. Ви маєте на увазі cut < fileпроти cut file? Потім дивіться unix.stackexchange.com/a/70759/22565
Stéphane Chazelas

вирізання може бути найкращим рішенням для цього простого завдання. Я б зарезервував awk (або perl) для більш складного узгодження.
ChuckCottrill

@StephaneChazelas Дякую за (характерне) розуміння :)
Джозеф Р.


1

І той, що проходить perl,

$ perl -pe 's/^([^ ]+) .*$/\1/' file
aaaaaaaa
bbbbbbbb
ccccccccccccccc
ddddd

Через GNU grep,

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.