패턴 매칭 분석을 위해 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)의 첫 번째 인수로 제공할 수 있습니다.

그런 다음 이 네 가지 awk호출은

  • 배열의 두 번째 열과 세 번째 열이 모두 비어 있지 않은 모든 행(열 헤더를 포함하는 첫 번째 행 무시)에 대한 사용자 이름(첫 번째 열 값)을 저장합니다.fully_played
  • 두 번째와 세 번째 열이 모두 비어 있는 배열에 모든 행의 사용자 이름을 저장합니다.not_played
  • 두 번째 열은 비어 있지 않지만 세 번째 열은 비어 있는 배열의 모든 행의 사용자 이름을 저장합니다.codec1_played
  • 두 번째 열은 비어 있지만 세 번째 열은 비어 있지 않은 배열에 모든 행의 사용자 이름을 저장합니다.codec2_played

호출 이후의 모든 줄은 awk배열이 올바르게 채워졌음을 증명하기 위해서만 존재합니다.

관련 정보