计算以“*”结尾的行数

mat*_*101 2 grep sed awk shell-script text-processing

我的目录中有几个包含此类内容的文件:

Wood *
Nails
Large Hammer *
Run Code Online (Sandbox Code Playgroud)

有些名字后面有一个星号,有些则没有。我有多个包含此类内容的文件。在每个文件中,产品旁边可能有一颗星,也可能没有。我需要制作一个 bash 脚本来计算所有文件中每个产品的星号出现次数。例如,输出需要如下所示:

Wood 12
Yellow Lamps 6
Nails 4
...
Run Code Online (Sandbox Code Playgroud)

这意味着在所有文件中,它在木材旁边发现了 12 颗星星,在灯旁边发现了 6 颗星星,等等......

用 C 语言解析它非常容易,但我不想运行二进制文件。我想要一个 shell 脚本,但我不太擅长使用 grep 和 awk,但我确信我需要这些。

我知道如何计算星星本身,但我不确定如何跟踪哪个星星属于哪个产品。

Gil*_*not 5

像这样,用一个

awk '$NF=="*"{$NF=""; arr[$0]++}END{for (i in arr) print i arr[i]}' ./*
Run Code Online (Sandbox Code Playgroud)
  • $NF默认情况下是最新的字符串,以空格分隔
  • 主要技巧是创建一个名为array 的关联,以当前单词作为并递增作为
  • END我们迭代每个键/值arr的ayprint

使用一行:

perl -anE '
    if ($F[-1] eq "*") {
        $k = join " ", @F[0..@F-2];
        $a->{$k}++
    }
    END{say "$_ $a->{$_}" for keys %$a}
' ./*
Run Code Online (Sandbox Code Playgroud)

-a是默认数组中的分割模式@F