在文本文件中,我有一些带有符号: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
答案 0 :(得分:2)
某些测试行(第一个: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
的任意组合。
答案 1 :(得分:1)
您可以使用Perl正则表达式和单词匹配:
grep -oP ':\w+' file.txt | sort | uniq
或者,只匹配非空格字符:
grep -o ':[^ ]*' file.txt | sort | uniq
答案 2 :(得分:0)
由于您还没有提供示例Input_file,因此无法对其进行测试,因为我没有和我一起使用zsh。请尝试以下操作并告诉我这是否对您有所帮助。
awk '/:[a-z]*/{sub(/ +$/,"");} !a[$0]++' Input_file | sort
答案 3 :(得分:0)
您可以尝试使用sed
sed 's/.*\(:[a-z]*\).*/\1/' file.txt | sort | uniq