パターンマッチング分析に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ファイルをシェルスクリプト($1)の最初の引数として提供できます。

それからこれらの4つのawk呼び出しは

  • 配列の2番目と3番目の列の両方が空でないすべての行(列ヘッダーを含む最初の行を無視)のユーザー名(最初の列値)を格納します。fully_played
  • 2番目と3番目の列の両方が空の配列に、すべての行のユーザー名を保存します。not_played
  • 2番目の列は空ではありませんが、3番目の列は空の配列のすべての行のユーザー名を格納します。codec1_played
  • 2番目の列は空ですが、3番目の列は空ではない配列にすべての行のユーザー名を格納します。codec2_played

呼び出し後のすべての行は、配列がawk正しく入力されたことを証明するためにのみ存在します。

関連情報