计算文件中以 tree 开头且不以 u 或 v 结尾的 7 个字符的单词数

Counting the number of 7 character words in a file that start with tree and do not end in u or v

我正在尝试计算文件中以 tree 开头但不以 u 或 v 结尾的 7 个字符的单词的数量。我知道如何指定以 tree 开头并以 u 或 v 结尾的条件cat,但我不确定如何准确识别 7 个单词或使用 wc 输入条件。我的路径名是 /users/file1.txt.

这是有效的 cat 命令(缺少 7 个字符的单词数)

  cat /users/file1.txt | grep ^tree.*[!uv]

下面是无效的 wc 命令(缺少 7 个字符的单词数)

  wc - w /users/file1.txt | grep ^tree.*[!uv]

使用 grepwc:

# echo the file       # filter files       # grep EXACT words     # count
cat  /users/file1.txt | grep ^tree.*[^u^v] | grep -o '[^\ ]\{7\}' | wc -w

管道演练:

回显源文件内容:

cat  /users/file1.txt

仅传递以 "tree" 开头且不以 "u" 或 "v" 结尾的文件:

grep ^tree.*[^u^v]

转发由 7 个非空格组成的任何单词(如果您只想要字母,请使用 [a-zA-Z] 而不是 [^\ ]):

grep -o '[^\ ]\{7\}'

统计出现在这里的单词数:

wc -w

这是另一种使用非常基本的方法 bash:

count=0

for word in $(cat f.py)
do
    if [ 7 -eq ${#word} ]
    then
        count=$((count+1))
    fi
done

echo $count

或在一行中:

count=0; for word in $(cat f.py); do if [ 7 -eq ${#word} ]; then count=$((count+1)); fi; done; echo $count

您可能希望从 word 中删除点和逗号。

sed -e 's/%//g' -e 's/\btree..[^uv]\b/%/g' -e 's/[^%]//g' -e 's/%/word /g' /users/file1.txt | wc -w

  1. 不要让任何人偷走我们的令牌。
  2. 给我们一个token,代表我们要统计的东西;匹配单词边界计数到 7,取反 (u,v) 中的匹配字符。
  3. 摆脱其他一切。
  4. 把我们的token变成一个友好的词加一个space.
  5. 数一数。

你喜欢perl吗?这里是一行:

cat /users/file1.txt | perl -lne 'if (/^(tree)(.{4}$)(?<![uv])/) { print $_ }'

Reut 的答案非常接近。

但这会让你到达你需要的地方:

cat /users/file1.txt | grep -wo 'tree..[^uv]' | wc -l
  • -w 将获得精确的单词匹配
  • 看到我放弃了 .* 并指定了 ..,因为匹配的字符总数是 7
  • 我也去掉了 ^tree 这样你也可以匹配不在行首的单词。