我想搜索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
答案 0 :(得分:1)
所以,一般来说,假设您有两个文件,a.txt和b.txt,如下所示。
A.TXT:
cat dog cat
b.txt
dog cat dog
你想计算" cat"和#34;狗"。这个脚本对我很有用,也许它可以帮助你找到你需要的地方:
countem.bsh
#!/bin/bash
for f in *.txt; do
echo "$f,`grep -o cat $f | wc -l`,`grep -o dog $f | wc -l`"
done
输出如下:
a.txt,2,1
b.txt,1,2
答案 1 :(得分:1)
这是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
,以获取所有匹配项。wc
删除tr
输出末尾的换行符。)echo
的换行符,以结束此文件的输出行。rs
以便很好地格式化列。该实用程序至少可以在BSD系统上使用...如果你没有它,只需移除管道并使用不稳定的列,或者使用| tr -s ' ' '\t'
代替,这样做的工作量很少。< / LI>
虽然不打印标题。
包含以下内容的两个文件:
$ 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...
...以及&#34;字&#34; a
,b
和c
,脚本执行此操作:
$ bash script.sh
text1 4 0 3
text2 7 1 1