最近我开始学习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文件的第一列中列出单个出现的列表,并将每个出现在一个数组上,然后用我之前编写的代码计算每一个。我需要一些帮助才能做到这一点
答案 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
:冒号,空间和第一组