在文本文件中列出单词后跟单词及其频率

时间:2015-06-24 16:14:21

标签: bash awk sed grep

是否有一种干净的方法可以使用grepsedawk获取文本文件中特定模式后面的单词列表及其频率?例如,假设以下文本文件:

155 20 120 156 20 9 157 158 9 40
163 7 95 164 20 9 165 9 40
99 100 20 15 29 101 6 9 40 165
9 22 23 167 168 9 165 171 40

我想知道9后面的单词是什么,以及它们出现在9旁边的次数。所以,输出看起来像这样:

157 1
40  3
165 2
22  1

6 个答案:

答案 0 :(得分:4)

使用GNU awk进行多字符RS:

$ awk -v RS='\\s+' 'p==9{c[$0]++} {p=$0} END{for (w in c) print w, c[w]}' file
165 2
157 1
22 1
40 3

其他问题:

$ awk '{for (i=2;i<=NF;i++) if ($(i-1)==9) c[$i]++} END{for (w in c) print w, c[w]}' file
165 2
157 1
22 1
40 3

答案 1 :(得分:3)

试试这个:

grep -owE "9 [0-9]+" filename | sed "s/^9 //" | sort -n | uniq -c

它几乎返回你想要的东西:

  1 22
  3 40
  1 157
  2 165

限制:此方法不会计算连续的9位数。

答案 2 :(得分:2)

使用awk,你可以写:

awk '
    {
        for (i=1; i<NF; i++) 
            if ($i == 9) 
                follow[$(++i)]++
    } 
    END {
        for (f in follow) 
            print f, follow[f]
    }
' file
22 1
40 3
157 1
165 2

答案 3 :(得分:1)

这是一个仅有awk的解决方案:

awk '{for(i=1; i < NF; i++){
      if($i == 9) nextToNine[$(i+1)]++;}} 
      END{for(j in nextToNine) print j"\t"nextToNine[j]}' test.txt

答案 4 :(得分:1)

将Perl正则表达式与grep一起使用:

grep -oP "(?<=\b9\s)\d+" file |sort -n|uniq -c

答案 5 :(得分:1)

仅Perl解决方案:

perl -ne '$h{$1}++ while /\b9 (\w+)/g }{ print "$_ $h{$_}\n" for keys %h' input.txt