【问题标题】:How to find which field in my CSV file appears the most using a shell script?如何使用 shell 脚本查找 CSV 文件中出现最多的字段?
【发布时间】:2020-02-17 07:34:32
【问题描述】:

我正在学习如何使用 Shell 脚本,我有一个包含 5 列 name forname telephone room email 的 CSV 文件,我想找出哪个 room包含最多的人。

目前我执行了以下代码,但我被困在需要计算哪个房间有更多员工或哪个房间在文件中出现最多的部分

input="x.csv"
while read line; do
    room=$(echo $line | cut -d \; -f 4)
    if [ -n "$room" ]; then

    fi
done < ${input}

【问题讨论】:

  • 您能否在预期输出中包含示例输入。

标签: bash shell csv unix


【解决方案1】:

使用uniq -c 可能最好地计算唯一值的出现次数。 因此,要单独计算每个房间的条目,您需要提取一个包含room 列的列表。 awk 可能是 bash 环境中执行此操作的最佳工具。 例如:

#!/bin/bash
input="x.csv"

awk '{print $4}' $input | sort | uniq -c

这将返回一个包含两列的列表。第一列包含第二列中各个值的出现次数,例如:

      4 room1b
      2 room1
      1 room2
      1 room3

如需更复杂的分析,请关注Corentin's lead 以扩展awk 的输入。

【讨论】:

    【解决方案2】:

    像这样解析 csv 文件很痛苦。

    使用awk

    awk -F';' '# CSV delimiter set to ;
        $4{ # This block will be executed if room value is not null
            n_persons[$4] += 1
            if (n_persons[$4] > max){
                max = n_persons[$4] #current max of employees per room
                room_max = $4 #current room that has most employees
            }
        }
        END{#this block is executed after reading the file
            print room_max
        }
    ' <file>
    

    【讨论】:

    • 嗨,非常感谢您的输入和链接 awk !
    【解决方案3】:

    如果你坚持使用 Bash,它有 associative arrays。我不完全确定您将如何在普通 bash 中对它们进行排序,并且仅使用 bash 听起来有点复杂。也许awk 会更好?

    在 Bash 而不是原来的方法中,我会使用以下管道来做到这一点:

    1. cut(选择列,就像你已经完成的那样)
    2. sort(对值进行排序,以便使用 uniq 处理它们)
    3. uniq -c(统计单个列值的出现次数)
    4. sort -nr(按出现次数降序排列——最大优先)
    5. head(只获取最频繁出现的情况)

    类似于(未经测试的):

    cut -d \; -f 4 input.csv \
      | sort \
      | uniq -c \
      | sort -nr \
      | head -1
    

    如果您需要过滤掉某些行,我会在cut 之后添加grep -v。无需使用条件、while 循环、read 内置。行尾的 \ 告诉 bash 这条“行”在下一行继续。

    以上是我第一次想到的。当然可以对其进行优化,但话又说回来,如果需要经常和尽可能快地执行,也许您应该寻找其他编程语言或范例。

    【讨论】:

    • 感谢您对cut, sort ... 的工作原理的大力投入,这真的很有帮助!
    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多