【问题标题】:frequency count for file column in bashbash中文件列的频率计数
【发布时间】:2016-10-09 15:37:58
【问题描述】:

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

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

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

编辑:现在我打印出我想要的如下:

1  
2307 Internet Explorer       
369 Safari  
2785 Chrome  
316 Opera  
4182 Firefox  

但我不明白这个“1”是从哪里来的

【问题讨论】:

    标签: bash shell awk count


    【解决方案1】:

    您只需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
    

    【讨论】:

    • 这会打印出列表中的不同出现次数,但我还想要它们出现在列中的次数。
    • 当然你可以看到awk -F '|' '{print $2}' file | sort | uniq -c
    • 是的,我发现我的管道顺序错误。非常感谢!
    • 是的freq 是更好的名字:)
    【解决方案2】:

    除其他外,您在$FILE 上运行uniq,而不是在$FILE 上运行awk 并将结果通过管道传输到排序然后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"
    

    【讨论】:

    • 啊,是的,这是你说的第一件事。配管顺序错误。现在一切都好。非常感谢!
    • 你是对的,复制粘贴的多余行再次感谢您!
    • 不客气。请阅读 [stackoverflow.com/help/someone-answers] 了解下一步该做什么。
    【解决方案3】:

    基于cut 的答案,(加上一点sed 用引号包围项目,更好地使空白行可见):

    cut -d'|' -f8 "$FILE" | sed 's/.*/"&"/' | sort | uniq -c
    

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多