是否有一种干净的方法可以使用grep
,sed
或awk
获取文本文件中特定模式后面的单词列表及其频率?例如,假设以下文本文件:
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
答案 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