我需要 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中使用sortuniq -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/

    10-15 05:10