使用bash计算.csv中类别中的名称数

使用bash计算.csv中类别中的名称数,bash,csv,sh,Bash,Csv,Sh,我想根据类别统计.csv文件中的学生人数 类别1是名称,类别2是国家,类别3是城市 .csv文件显示如下: michael_s;jpa;NYC john_d;chn;TXS jim_h;usa;POP 我尝试了我的.sh脚本,但没有成功 sort -k3 -t; students.csv 编辑: 我正在尝试制作一个bash脚本,它可以按城市统计学生人数,也可以通过执行脚本(如 cat students.csv | ./script.sh NYC 如果我理解正确,终端将只显示来自纽约的学生,

我想根据类别统计.csv文件中的学生人数

类别1是名称,类别2是国家,类别3是城市

.csv文件显示如下:

michael_s;jpa;NYC
john_d;chn;TXS
jim_h;usa;POP
我尝试了我的.sh脚本,但没有成功

sort -k3 -t; students.csv
编辑:

我正在尝试制作一个bash脚本,它可以按城市统计学生人数,也可以通过执行脚本(如

cat students.csv | ./script.sh NYC

如果我理解正确,终端将只显示来自纽约的学生,像这样吗

cut -d";" -f3 mike.txt | sort | uniq -c 
(抱歉,第一次解决方案不正确-现在更新)

要仅计算一个城市:

cut-d“;”-f3 mike.txt | grep“NYC”| wc-l


根据文件的大小、您执行此操作的频率等,可以考虑其他解决方案,例如awk。但这个解决方案会很好地发挥作用

出现错误消息“排序:多字符选项卡'students.csv'”的原因是您没有为
-t
选项指定分隔符。如果在
-t
之后添加分号,排序将按预期进行:

sort -k3 -t';' students.csv
总是有awk:

$ awk -F\; 'a[$1]++==0{c++}END{print c}' file
3
一旦您更全面地描述了您的需求,(数一数名称,但
排序-k3
。请更新OP),我们可以更好地帮助您

已编辑以匹配您的更新:

$ awk -F\; -v col=3 -v val=NYC '
(length(val) && $col==val) || length(val)==0 && a[$col]++==0 {
    c++
}
END { print c }
' file
1

如果使用要查找的值设置
-v val=
,并使用列号设置
-v col=
,则会统计
col
中出现的
val
。您设置了
col
,但没有设置
val
col

中计算不同的值,张贴预期结果,显示“排序:多字符选项卡'students.csv'”,但实际上没有做任何事情错误消息不是预期结果,很明显预期输出是什么?我在字段3上排序并计数。如果您想计算其他字段,则将剪切中的-f3更改为您要计算的字段。即,要按国家计数,请使用剪切-d”;“-f2,要按名称计数,请使用剪切-d”;“-F1有办法只计算一个城市吗?例如./script.sh NYC,它将仅显示已升级解决方案的NYCI学生人数。如果您想将值作为parm传递到脚本中,请使用$1而不是“NYC”(或任何参数编号-我个人通常在开始时将参数分配给脚本中的特定变量以清晰显示)。它只显示1,而不是特定城市的学生人数。这比我的cut/sort/uniq解决方案要好。如果可以的话,你应该用这个。除非您正在检查的文件都很小,否则在这种情况下可能没有什么区别,“基本”解决方案可能更易于阅读,以供不太懂*nix的人将来参考。@AlanS。看来是这样。显然,它需要比我最初想象的更多的调整。@AlanS。现在怎么样(顺便说一句,你可以发布更明确的数据样本和预期的输出)?@urbanspaceman我不能这样做:(我必须这样做,当用户执行脚本时,它会按国家显示学生人数,但也会使它仅显示在执行脚本时使用国家名称询问的国家的编号,例如(cat students.csv|/script.sh NYC)或(cat students.csv|/script.sh POP)