搜索单词并在文件中计算其出现次数

时间:2016-06-23 19:51:09

标签: linux shell unix

我想搜索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

2 个答案:

答案 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; abc,脚本执行此操作:

$ bash script.sh
text1  4      0      3
text2  7      1      1