Bash - 如何计算.csv文件列中的出现次数(不使用awk)

时间:2018-03-29 06:54:57

标签: bash

最近我开始学习bash脚本,我想知道如何计算.csv文件列中的出现次数,该文件的结构如下:

    DAYS,SOMEVALUE,SOMEVALUE
    sunday,something,something
    monday,something,something
    wednesday,something,something
    sunday,something,something
    monday,something,something

所以我的问题是:每次第一列(天)的每个值出现时我怎么算?在这种情况下,输出必须是:

    Sunday : 2
    Monday : 2
    Wednesday: 1

第一列名为DAYS,因此脚本不必处理单值DAYS,DAYS只是识别列的一种方法。

如果可能的话,我希望看到没有awk命令且没有phyton ecc的解决方案..

Thx伙伴们抱歉我的英文不好

编辑:我想这样做:

    count="$( cat "${FILE}" | grep -c "OCCURENCE")"
    echo "OCCURENCE": ${count}

OCCURENCE是单一值(星期日,星期一......) 但是这个解决方案不是自动的,我需要在.csv文件的第一列中列出单个出现的列表,并将每个出现在一个数组上,然后用我之前编写的代码计算每一个。我需要一些帮助才能做到这一点

2 个答案:

答案 0 :(得分:1)

cut -f1 -d, test.csv | tail -n +2 | sort | uniq -c

这让你走得很远:

  2 monday
  2 sunday
  1 wednesday

要获取您的格式(Sunday : 1),我认为awk将是一种简单明了的方式(类似于awk '{print $2 " : " $1}',但如果你真的必须这样,那么这是一个完整的非awk版本:

cut -f1 -d, test.csv | uniq -c | tail -n +2 | while read line; do words=($line); echo ${words[1]} : ${words[0]}; done

答案 1 :(得分:0)

使用sed格式化结果的@ sneep答案的变体:

cut -f1 -d, /tmp/data  | tail -n +2 | sort | uniq -c | sed 's|^ *\([0-9]*\) \(.*\)|\u\2: \1|g'

输出:

Monday: 2
Sunday: 2
Wednesday: 1

sed匹配:

  • ^ *:行的开头,然后是任意数量的空格
  • \([0-9]*\):任意数量的数字(将它们存储在一个组中\ 1)
  • :单个空格
  • \(.*\):任何字符,直到最后,将其存储在组\ 2

并将匹配替换为:

  • \u\2:第二组,大写第一个字符
  • : \1:冒号,空间和第一组