计算文件中以 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]
使用 grep
和 wc
:
# 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
- 不要让任何人偷走我们的令牌。
- 给我们一个token,代表我们要统计的东西;匹配单词边界计数到 7,取反 (u,v) 中的匹配字符。
- 摆脱其他一切。
- 把我们的token变成一个友好的词加一个space.
- 数一数。
你喜欢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
这样你也可以匹配不在行首的单词。
我正在尝试计算文件中以 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]
使用 grep
和 wc
:
# 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
- 不要让任何人偷走我们的令牌。
- 给我们一个token,代表我们要统计的东西;匹配单词边界计数到 7,取反 (u,v) 中的匹配字符。
- 摆脱其他一切。
- 把我们的token变成一个友好的词加一个space.
- 数一数。
你喜欢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
这样你也可以匹配不在行首的单词。