Shell编程如何计算单词出现在一行中的次数?

时间:2016-04-06 19:50:37

标签: shell awk count line word

如何计算单词出现在一行中的次数? 例如,我有“man”这个词和以下几行:

a man walks here
nobody over here
from man to man

结果应该是:第一行,一次,第二行0次,最后一次两次。

5 个答案:

答案 0 :(得分:1)

使用awk可以轻松完成:

awk -F 'man' '{print (NF?NF-1:0)}' file

1
0
2

-F 'man'将输入字段分隔符设置为manNF打印每行的字段数。

如果您想要计算完整的单词,请使用此gnu-awk

awk -F '\\<man\\>' '{print (NF?NF-1:0)}' file

对于非gnu awk,你可以使用它:

awk -F '(^|[^[:alnum:]])man([^[:alnum:]]|$)' '{print (NF?NF-1:0)}' file

答案 1 :(得分:1)

如果您不想计算mankind或其他包含man的字符串,您可以在空格上打破并遍历每个字段:

$ awk '{c=0; for(i=1;i<=NF;i++) if ($i~/^man$/) c++; print c}' file

如果您想使用变量:

$ awk -v m=man '{c=0; for(i=1;i<=NF;i++) if ($i==m) c++; print c FS m}' file

如果你有gawk vs POSIX awk,你可以这样做:

$ awk '{n=gsub(/\<man\>/, ""); print n}' file

答案 2 :(得分:0)

$ cat file
a man walks here
nobody over here

from man to man

$ awk -v tgt="man" '{print gsub("(^|[[:space:]])"tgt"([[:space:]]|$)","&")}' file
1
0
0
2

以上内容适用于任何awk,它只依赖于空格分隔的单词。

答案 3 :(得分:0)

如果你想看到一个亚麻布,并且跳过没有出现的线条,你可以尝试像

这样的东西
find . -type f -name '*.spec' -print0 | \
while IFS= read -r -d '' dot_spec_file; do \
cat "$dot_spec_file" | \
tr -d '\15\32' | \
sponge "$dot_spec_file" \
; done

答案 4 :(得分:0)

尝试使用此版本:它启用多文件搜索,生成的输出类似于 grep -nH

* {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
}

html,
body {
    width: 100%;
    height: 100%;
}

.wrap {
    perspective: 600px;
    perspective-origin: 50% 100px;
    width: 100%;
    height: 100%;
    overflow: hidden;
}

.cube {
    position: relative;
    transform-style: preserve-3d;
    height: 100%;
    width: 100%;
}

.cube > div {
    position: absolute;
    height: 100%;
    width: 100%;
}

.cube > div:not(.front) {
    border: 1px solid black;
    background: lightgrey;
}

.back {
    transform: rotateY(180deg) translateZ(400px);
    //transform:  translateZ(400px);
}

.left {
    transform: rotateY(270deg) translateX(-400px);
    transform-origin: left center;
}

.right {
    transform: rotateY(-270deg) translateX(400px);
    transform-origin: right top;
}

.bottom {
    transform: rotateX(90deg) translateY(10px);
    transform-origin: center bottom;
}

.top {
    transform: rotateX(-90deg) translateY(30px);
    transform-origin: left top;
}

.front {
    transform: translateZ(100px);
}

.content {
    padding: 15px;
    width: 100%;
    height: 100%;
    transform: rotateY(180deg);
}

.content > div {
    float: left;
}

.content > .video-wrapper {
    line-height: 100%;
}

.content > .text {
    width: 35%;
    padding-left: 15px;
    text-align: left;
}

.only-video {
    width: inherit;
    height: inherit;
}

.only-video iframe {
    width: inherit;
    height: inherit;
}

测试:

#!/usr/bin/awk -f
BEGIN {
  word=ARGV[1];
  ARGV[1]="";
  print "Filename:Line #:" word " #:source line";
}
{
  count=0;
  for (i=1; i<=NF; i++) {
    if ($i == word) {
      count++;
    }
  }
  print FILENAME ":" FNR ":" count ":" $0;
}