bash中文件列的频率计数

时间:2016-10-09 15:37:58

标签: bash shell awk count

我有一个包含8列的文件,使用“|”作为分隔符,我想计算第8列中单词的出现频率。我试过像这样的awk

awk -F '{print $8}' | sort | uniq -c $FILE 

但是我得到了整个文件的打印件,我无法理解我做错了什么。

编辑:现在我打印出我想要的内容如下:
1
2307 Internet Explorer
369 Safari
2785铬 316歌剧 4182 Firefox
但我无法理解这个“1”来自哪里

3 个答案:

答案 0 :(得分:3)

除此之外,您在uniq上运行$FILE而不是在awk上运行$FILE并将结果排序以排序然后uniq。你打算写:

awk -F'|' '{print $8}' "$FILE" | sort | uniq -c

但你只需要一个命令:

awk -F'|' '{cnt[$8]++} END{for (key in cnt) print cnt[key], key}' "$FILE"

wrt I can't understand where this "1" come from - 您的输入文件中有1个空8美元。也许是一个空白行。你可以找到它:

awk -F'|' '$8~/^[[:space:]]*$/{print NR, "$0=<"$0">, $8=<"$8">"}' "$FILE"

答案 1 :(得分:2)

您可以awk执行此操作:

awk -F '|' '{freq[$8]++} END{for (i in freq) print freq[i], i}' file

此awk命令使用|作为分隔符,并使用数组seen,密钥为$8。当它找到键$8时,将频率(值)增加1。 顺便说一下,你需要在命令中添加自定义分隔符|并使用它:

awk -F '|' '{print $8}' file | sort | uniq -c

答案 2 :(得分:0)

基于sed的答案(加上一些cut -d'|' -f8 "$FILE" | sed 's/.*/"&"/' | sort | uniq -c 来围绕带引号的项目,最好使空白行可见):

{{1}}