我需要 shell 程序中的命令行,其中给定一个文本文件“novel”,并将每个单词及其对应的行数显示在一行中,并将其写入名为“words”的文件中。问题在于单词不能带有标点符号。
这就是我所拥有的
$ awk '{for(i=1; i<=NF; ++i) {printf $i "\t" NR "\n", $0 > "words"}}' novel
该文件包含:
$ cat novel
ver a don Quijote, y ellas le defendían la puerta:
-¿Qué quiere este mostrenco en esta casa?
预期产量:
ver 1
a 1
don 1
Quijote 1
...
puerta 1
Qué 2
...
casa 2
这是一个非常简单的命令,可供学术使用。
最佳答案
使用awk
试试这个命令:
awk '{gsub(/[[:punct:]]/, "")} 1' RS='[[:space:]]' novel >words
例如,考虑以下文件:
$ cat novel
It was a "dark" and stormy
night; the rain fell in torrents.
$ awk '{gsub(/[[:punct:]]/, "")} 1' RS='[[:space:]]' novel
It
was
a
dark
and
stormy
night
the
rain
fell
in
torrents
或者,要将输出保存在文件
words
中,请使用:awk '{gsub(/[[:punct:]]/, "")} 1' RS='[[:space:]]' novel >words
工作原理:
gsub(/[[:punct:]]/, "")
这告诉awk查找任何标点并将其替换为空字符串。
[:punct:]
是包含所有标点符号的字符类。该形式包括unicode定义的所有标点符号。 Unicode定义了许多类型的引号字符。这将包括所有这些。 1
这是awk打印记录的简写。
RS='[[:space:]]'
这告诉awk使用任何空白序列作为记录分隔符。这意味着每个单词都定义了一个单独的记录,而awk将读入一个单词作为处理时间。
数词
在Unix中使用
sort
和uniq -c
计数项目的常用方法如下:$ echo 'one two two three three three' | awk '{gsub(/^[[:punct:]]|[[:punct:]]$/, "")} 1' RS='[[:space:]]' | sort | uniq -c
1 one
3 three
2 two
另外,awk可以完成所有操作:
$ echo 'one two two three three three' | awk '{gsub(/^[[:punct:]]|[[:punct:]]$/, ""); a[$0]++} END{for (w in a) print w,a[w]}' RS='[[:space:]]'
three 3
two 2
one 1
替代awk方法
Andriy Makukha建议我们不希望像
I've
中的单引号一样从单词中删除标点符号。同样,我们可能不想删除URL中的句点,以便google.com
保持google.com
。为了仅在单词的开头或结尾删除标点符号,我们将gsub
命令替换为:gsub(/^[[:punct:]]|[[:punct:]]$/, "")
例如:
$ echo "I've got 'google.com'" | awk '{gsub(/^[[:punct:]]|[[:punct:]]$/, "")} 1' RS='[[:space:]]'
I've
got
google.com
使用sed
此sed命令将删除所有标点符号,并将每个单词放在单独的行上:
sed 's/[[:punct:]]//g; s/[[:space:]]/\n/g' novel
如果在其上运行命令,则将获得:
$ sed 's/[[:punct:]]//g; s/[[:space:]]/\n/g' novel
It
was
a
dark
and
stormy
night
the
rain
fell
in
torrents
如果要将单词保存在文件
words
中,请尝试:sed 's/[[:punct:]]//g; s/[[:space:]]/\n/g' novel >words
__这个怎么运作:_
s/[[:punct:]]//g
这告诉sed查找任何出现的标点,然后将其替换为空。同样,我们使用
[:punct:]
,因为它将处理所有unicode定义的标点字符。 s/[[:space:]]/\n/g
这告诉sed查找任何空白序列并将其替换为单个换行符。
关于shell - 如何使用awk删除标点符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48677997/