我有一个包含括号中的单词的文件。我想编译出现在那里的所有独特单词的列表,例如:
This is some (text).
This (text) has some (words) in parenthesis.
Sometimes, there are numbers, such as (123) in parenthesis too.
这将是结果列表:
text
words
123
如何列出括号之间出现的所有项目?
你可以awk
这样使用:
awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' file.txt
印刷:
text
text
words
123
您可以使用数组来打印唯一值:
awk -F "[()]" '{ for (i=2; i<NF; i+=2) array[$1]=$i; print array[$1] }' file.txt
印刷:
text
words
123
高温高压
使用 GNU grep,您可以使用与 perl 兼容的正则表达式和环视断言来排除括号:
grep -Po '(?<=\().*?(?=\))' file.txt | sort -u
grep -oE '\([[:alnum:]]*?\)' | sed 's/[()]//g' | sort | uniq
-o
只打印匹配的文本-E
表示使用扩展正则表达式\(
表示匹配文字括号[[:alnum:]]
是字母和数字的 POSIX 字符类。该sed
脚本应该去掉括号。这是针对 GNU grep 测试的,但是 BSD sed 所以要小心。
要重现您的列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/'
要编译唯一词列表,您需要进一步处理该列表:
cat file.txt | sed 's/.*(\(.*\)).*/\1/' | sort | uniq
你可以试试这个
sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename|awk -F'(' '{print $2}'|sort -u
解释:
第一个 sed 语句将括号中的单词放在新行中,第二个 sed 将字符 ')' 替换为新行。所以在运行下面的语句之后
sed -e 's/\(/\n\(/g' -e 's/\)/\n/g' filename
输出看起来像这样
This is some
(text
.This
(text
has some
(words
in parenthesis.
Sometimes, there are numbers, such as
(123
in parenthesis too.
现在将此输出传递到下面的 awk 语句,该语句打印过滤器字符 '(' 之间的第二个单词
awk -F'(' '{print $2}'
现在的输出将是
text
text
words
123
上面的输出通过管道传送到 sort -u 命令,以从上面的输出中给出唯一的单词。希望这个解释有所帮助。