要向用户播放的编解码器文件是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
- 我希望将编解码器完整播放的[用户]存储在数组中
-(fully_played[]).
- 未播放任何编解码器的用户将存储在数组中
-(not_played[]).
- 仅向用户播放的欢迎编解码器存储在数组中
-(codec1_played[])
- 仅向用户播放的公告编解码器存储在数组中
-(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
仅用于证明数组已正确填充。