удалить пробелы из конвейера - PullRequest
0 голосов
/ 28 апреля 2018

В текстовом файле у меня есть несколько тегов с обозначением :foo. Чтобы получить обзор моих тегов в файле, я хочу получить список всех этих тегов.

Это делается через

grep -o -e ":[a-z]*\( \|$\)" file.txt | sort |  uniq

Теперь я получаю дубликаты из-за пробела или символа новой строки в конце.

:movie  <-- only newline
:movie  <-- whitespace and newline
:read
:read 

Я хочу избежать дубликатов. Но я не мог понять, как. Я пробовал с | tr -d '[:space:]', но это приводит только к объединению всех выходных данных канала ...

Пример файла file.txt

Avengers: Infinity War :movie
Yojimbo 1961 :movie nippon

Ответы [ 4 ]

0 голосов
/ 29 апреля 2018

Вы можете использовать регулярные выражения Perl и сопоставление слов:

grep -oP ':\w+' file.txt | sort |  uniq

или просто сопоставьте непробельные символы:

grep -o ':[^ ]*' file.txt | sort |  uniq
0 голосов
/ 29 апреля 2018

Вы можете попробовать с помощью sed

sed 's/.*\(:[a-z]*\).*/\1/' file.txt | sort | uniq
0 голосов
/ 29 апреля 2018

Некоторые тестовые строки (после первого :space есть пробел, вы можете увидеть его, если выделите данные мышью):

$ cat file
with :space 
with :space too
without :space
test: this

С grep, sort и uniq:

$ grep -o ":[a-z]\+" file | sort | uniq 
:space

С awk (ну, gawk и mawk по крайней мере):

$ awk 'BEGIN{RS="[" FS "|" RS "]+"}/:[a-z]/&&!a[$0]++' file
:space

Каждое слово является собственной записью, и мы выбираем первый экземпляр каждого слова, начинающегося с двоеточия. RS="[" FS "|" RS "]+" может быть написано иначе, но именно в этой форме подчеркивается любая комбинация FS и RS.

0 голосов
/ 28 апреля 2018

Поскольку вы не предоставили образец Input_file, поэтому не можете его протестировать, так как у меня нет zsh. Попробуйте выполнить и дайте мне знать, если это вам поможет.

awk '/:[a-z]*/{sub(/ +$/,"");} !a[$0]++' Input_file | sort
...