Używanie sed / awk do usuwania czegokolwiek po pierwszym spacji

20
aaaaaaaa 09  
bbbbbbbb 90   
ccccccccccccccc  89  
ddddd 09

Używając sed / awk / replace, w powyższym tekście chcę usunąć wszystko, co następuje po pierwszym spacji w każdym wierszu. Na przykład dane wyjściowe będą:

aaaaaaaa  
bbbbbbbb    
ccccccccccccccc  
ddddd 

każda pomoc będzie mile widziana.

Rana Khan
źródło

Odpowiedzi:

35

Sed

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

Grep

grep -o '^\S*'

Awk

awk '{print $1}'

Jak wskazano w komentarzach, -onie jest POSIX; jednak zarówno GNU, jak i BSD go mają, więc powinno działać dla większości ludzi.

Ponadto, \s/ \Snie może być na wszystkich systemach, jeśli twój nie rozpoznaje go można użyć dosłownego przestrzeń, lub jeśli chcesz przestrzeń i kartę, a te w wyrażeniu wspornik ( [...]) lub [[:blank:]]klasę postaci (uwaga, że ściśle mówiąc \sjest równoważne [[:space:]]i zawiera znaki odstępów pionowych, a także CR, LF lub VT, o które prawdopodobnie nie dbasz).

Ten awk zakłada, że ​​linie nie zaczynają się od pustego znaku.

Kevin
źródło
14
cut -d ' ' -f 1 < your-file

byłby najbardziej wydajny.

Stéphane Chazelas
źródło
4
Zauważyłem to w kilku twoich odpowiedziach i zastanawiałem się, czy istnieje ku temu powód: zawsze wydajesz się dodawać przekierowanie wejściowe, nawet jeśli polecenie może bez niego działać. Czy możesz wyjaśnić, dlaczego <jest to przydatne tutaj?
Joseph R.
5
@JosephR. Masz na myśli cut < filevs cut file? Następnie zobacz unix.stackexchange.com/a/70759/22565
Stéphane Chazelas,
cięcie może być najlepszym rozwiązaniem problemów tak prostych. Zarezerwowałbym awk (lub perl) na bardziej złożone dopasowanie.
ChuckCottrill
@StephaneChazelas Dziękuję za (charakterystyczny) wgląd :)
Joseph R.
5
awk '{print $1}' file

lub

sed 's/ .*//'
jlliagre
źródło
1

A jeden przez perl,

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

Poprzez GNU grep

$ grep -oP '^[^ ]*' file
bbbbbbbb
ccccccccccccccc
ddddd
Avinash Raj
źródło