我想搜索 3 个词并计算它们在数十个文件中的出现次数。这些文件名包含前缀 + 时间戳,如 FTM.FC102.20160623183001.20160623184500
我想在他们身上搜索以下单词:Date
OK
RETRY
DROP
然后将他们的计数放入新文件中。所需的输出应该是这样的:
filename OK RETRY DROP
=================================
XXX20160622XXX 221 305 400 //those values are the count of words
....... ... ... ...
我尝试了以下方法:
fileName=$(date --date="-1 day" +"%Y%m%d")
cd /advdata/ticketdatashareA/FTM_Sms/
format=*`echo $fileName`*
for i in $format;
do
if [[ "$i" == "$format" ]]
then
echo "No Files"
else
echo -n "file name $i :" | cut -c21-49 ; echo '\t' `grep OK $i | wc -l`; echo '\t' `grep "RETRY" $i | wc -l`; echo '\t' `grep "DROP" $i | wc -l`;
fi
done
我得到的是:
20160623134501.20160623140000
\t 107
\t 0
\t 0
最佳答案
这是 Bash 的解决方案:
declare -a words=( OK RETRY DROP )
echo "filename" "${words[@]}" | tr ' ' '\t' # added in late edit
for file in FTM.FC102.*; do
printf "$file "
for word in "${words[@]}"; do
grep -o "$word" "$file" | wc -l | tr '\n' ' '
done
echo
done | rs 0 $(( ${#words[@]} + 1 )) # alternatively: | tr -s ' ' '\t'
解释:
- 我们将要查找的单词存储在数组
words
中。 - 遍历文件(更改模式以满足您的需要)。
- 对于每个文件,我们构造一行以文件名开头,然后...
- 对于每个单词,
grep -o
在文件中获取所有匹配项。 - 计算匹配项的数量(使用
tr
从wc
的输出末尾删除换行符)。 - 在该行的末尾,发出一个带有空
echo
的换行符以结束该文件的输出行。 - 将所有内容通过管道传输到
rs
以很好地格式化列。此实用程序至少在 BSD 系统上可用...如果您没有,只需删除管道并使用不稳定的列,或使用| tr -s ' ' '\t'
相反,它的工作还算不错。
虽然不打印标题。
有两个文件,内容如下:
$ cat text1
Neque porro quisquam est qui dolorem ipsum quia dolor sit amet,
consectetur, adipisci velit...
$ cat text2
There is no one who loves pain itself, who seeks after it and wants to
have it, simply because it is pain...
...以及“单词”a
、b
和 c
,脚本执行以下操作:
$ bash script.sh
text1 4 0 3
text2 7 1 1
关于linux - 搜索一个词并计算它在文件中的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000612/