我有一个包含8列的文件,使用“|”作为分隔符,我想计算第8列中单词的出现频率。我试过像这样的awk
awk -F '{print $8}' | sort | uniq -c $FILE
但是我得到了整个文件的打印件,我无法理解我做错了什么。
编辑:现在我打印出我想要的内容如下:
1
2307 Internet Explorer
369 Safari
2785铬
316歌剧
4182 Firefox
但我无法理解这个“1”来自哪里
答案 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}}