使用 CSV 文件进行模式匹配分析并将结果存储在数组中

使用 CSV 文件进行模式匹配分析并将结果存储在数组中

要向用户播放的编解码器文件是CODEC=welcome1.g711u,Announcementbui4.g711u.

从日志来看,向用户播放的编解码器文件被 grep 并存储在E41.csv文件中。

正确播放两个编解码器的用户的 CSV 文件内容:

users,codec1,codec2
9188888881,welcome1.g711u,Announcementbui4.g711u
9177777772,welcome1.g711u,Announcementbui4.g711u
9166666663,welcome1.g711u,Announcementbui4.g711u
9155555554,welcome1.g711u,Announcementbui4.g711u
9144444445,welcome1.g711u,Announcementbui4.g711u

csv 文件内容可以是 5 个用户中的 1 个,两个编解码器均未播放,用户立即断开通话:[注意用户 9177777772]

users,codec1,codec2
9188888881,welcome1.g711u,Announcementbui4.g711u
9177777772,
9166666663,welcome1.g711u,Announcementbui4.g711u
9155555554,welcome1.g711u,Announcementbui4.g711u
9144444445,welcome1.g711u,Announcementbui4.g711u

类似地,可能有一个用户在welcome1单独玩过一次后就断开连接,情况Announcement也是如此。

9188888881,welcome1.g711u,Announcementbui4.g711u
9177777772,welcome1.g711u
9166666663,,Announcementbui4.g711u
9155555554,welcome1.g711u,Announcementbui4.g711u
9144444445,welcome1.g711u,Announcementbui4.g711u

  1. 我希望将编解码器完整播放的[用户]存储在数组中-(fully_played[]).
  2. 未播放任何编解码器的用户将存储在数组中-(not_played[]).
  3. 仅向用户播放的欢迎编解码器存储在数组中-(codec1_played[])
  4. 仅向用户播放的公告编解码器存储在数组中-(codec2_played[]).

到目前为止我尝试过的:

codec12="$( awk -F, '{if (($2 == "welcome1.g711u") && ($3 == "Announcementbui4.g711u")) { print $1 } }' $CURRENTPATH/E41.csv | head)"
{ printf "%s\n" "$codec12"; }>$CURRENTPATH/codec12.csv

name=( $(awk '{print $1}' $CURRENTPATH/codec12.csv) )
echo ${name[*]}
len4=${#name[*]}
echo $len4

返回 4

与其重定向到 .csv 文件并再次存储到数组中,看起来很乏味。有没有办法将 awk 模式匹配存储到数组中?

答案1

由于您希望将用户 ID 存储在 bash 数组中,因此似乎不太可能避免多次调用awk.以下 bash 脚本应该完成该任务:

#!/bin/bash

fully_played=( $(awk -F, 'FNR>1 && $2 && $3 {print $1}' "$1") )
not_played=( $(awk -F, 'FNR>1 && !$2 && !$3 {print $1}' "$1") )
codec1_played=( $(awk -F, 'FNR>1 && $2 && !$3 {print $1}' "$1") )
codec2_played=( $(awk -F, 'FNR>1 && !$2 && $3 {print $1}' "$1") )

echo "Fully played: ${#fully_played[@]} - ${fully_played[@]}"
echo "Not played: ${#not_played[@]} - ${not_played[@]}"
echo "Codec1 played: ${#codec1_played[@]} - ${codec1_played[@]}"
echo "Codec2 played: ${#codec2_played[@]} - ${codec2_played[@]}"

您可以将 CSV 文件作为第一个参数提供给 shell 脚本 ( $1)。

然后这四个awk调用将

  • 存储所有行的用户名(第一列值)(忽略包含列标题的第一行),其中数组中第二列和第三列均非空fully_played
  • 存储数组中第二列和第三列均为空的所有行的用户名not_played
  • 存储数组中第二列非空但第三列为空的所有行的用户名codec1_played
  • 存储数组中第二列为空但第三列非空的所有行的用户名codec2_played

调用之后的所有行awk仅用于证明数组已正确填充。

相关内容