如何使用bash脚本提取和计算文件中不同的短语出现?

时间:2017-09-14 16:39:52

标签: bash awk sed grep

我有一个包含以下文本的日志文件:

    "Blablabla" [texttext] "text" 148 228 "blabla" "phrase 1"
    "Blablabla" [texttext] "text" 220 211 "blabla" "phrase 1"
    "Blablabla" [texttext] "text" 148 215 "blabla" "phrase 2"
    "Blablabla" [texttext] "text" 220 245 "blabla" "phrase 3"
    "Blablabla" [texttext] "text" 200  -  "blabla" "phrase 4"
    "Blablabla" [texttext] "text" 148 200 "blabla" "phrase 4"

我需要编写脚本,只使用第一个数字2的行**然后提取"短语X"并将他们的计数和比例放在另一个档案中。

我想用这样的东西

    cat log.txt | grep '" 2..' > to something

但我无法弄清楚我应该使用什么 - sed,awk或其他任何东西。我想,我还需要使用bash数组。但是,我怎样才能使用循环来查找 - 是否已存在的短语?

感谢您的帮助。

UPD。我需要看到像

这样的东西
1. Phrase 1 - 500 - 50%
2. Phrase 2 - 340 - 34%
3. Phrase 3 - 100 - 10%
4. Phrase 4 - 60 - 6%

是的,那是我的坏事,我已经忘记了。我只需要这些短语中的前十名。

2 个答案:

答案 0 :(得分:1)

假设您指的是第4列,该列只有3位数字:

{
  registration: {
    nickname: 'foo',
    email: 'bar',
    password: 'password',
    passwordConfirmation: 'password'
  }
}
在您的情况下

输出:

cat line_with_input | grep -E '.*\s.*\s.*\s2[0-9]{2}.*' | awk '{print $7" "$8}' | sort | uniq -c

编辑:所以你不想只计算不同的短语?

答案 1 :(得分:1)

对于您问题中的特定输入数据:

$ cat file1
    "Blablabla" [texttext] "text" 148 228 "blabla" "phrase 1"
    "Blablabla" [texttext] "text" 220 211 "blabla" "phrase 1"
    "Blablabla" [texttext] "text" 148 215 "blabla" "phrase 2"
    "Blablabla" [texttext] "text" 220 245 "blabla" "phrase 3"
    "Blablabla" [texttext] "text" 200  -  "blabla" "phrase 4"
    "Blablabla" [texttext] "text" 148 200 "blabla" "phrase 4"

$ awk '$4~/2../{l++;a[$7FS$8]++}END{print "total phrases:" l; \
for (i in a) print i,"-", "Found:",a[i],"-","Ratio:",a[i]/l*100 "%"}' file1

total phrases:3
"phrase 1" - Found: 1 - Ratio: 33.3333%
"phrase 3" - Found: 1 - Ratio: 33.3333%
"phrase 4" - Found: 1 - Ratio: 33.3333%

显然,在这个例子中,总短语是指在字段4以2开头的行中找到的短语

为了获得前10名,一种简单的方法是运行上面的代码,然后使用sort + head:

$ awk 'your awk code here' file |sort |head #Head without options returns the top 10 lines.

PS:您需要调整排序选项以根据比率列或短语计数列(awk输出)进行排序。