जानना चाहते हैं कि $1 और $2 के संयोजन के आधार पर कैसे गिनें, $3,$4,$5,$6 और $7 से 1, 2, 3 और 4 की घटनाओं की संख्या

नमूना इनपुट

Name,Date,XXX,YYY,ZZZ,AAA,BBB
ABC,19-10-2020,2,NA,4,3,NA
ABC,19-10-2020,NA,3,NA,NA,4
ABC,18-10-2020,1,NA,4,4,NA
ABC,18-10-2020,NA,3,NA,NA,4
CDE,19-10-2020,1,NA,4,3,NA
CDE,19-10-2020,NA,2,NA,NA,4
CDE,18-10-2020,3,3,4,3,3
CDE,18-10-2020,NA,3,NA,NA,4
FGH,18-10-2020,4,4,4,4,4

वांछित आउटपुट

Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4
ABC,19-10-2020,0,1,2,2
ABC,18-10-2020,1,0,1,3
CDE,19-10-2020,1,1,1,2
CDE,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5

मैंने असफल आउटपुट के साथ नीचे दिए गए कमांड की तरह कोशिश की है। कृपया इस पर मदद करें।

awk -F"," '{OFS=","; print $1,$2}'  | awk -F"," 'BEGIN {count=0} {key=$0; a[key]++} END {for (i in a) print i,a[i]}'
awk
1
SVR 22 अक्टूबर 2020, 21:16

5 जवाब

सबसे बढ़िया उत्तर
$ cat tst.awk
BEGIN {
    FS = OFS = ","
    maxVal = 4
}
NR > 1 {
    key = $1 OFS $2
    keys[key]
    for (i=3; i<=NF; i++) {
        cnt[key,$i]++
    }
}
END {
    printf "Name%sDate%s", OFS, OFS
    for (i=1; i<=maxVal; i++) {
        printf "CountOF %d%s", i, (i<maxVal ? OFS : ORS)
    }

    for (key in keys) {
        printf "%s%s", key, OFS
        for (i=1; i<=maxVal; i++) {
            printf "%d%s", cnt[key,i], (i<maxVal ? OFS : ORS)
        }
    }
}
$ awk -f tst.awk file
Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4
ABC,19-10-2020,0,1,2,2
ABC,18-10-2020,1,0,1,3
CDE,19-10-2020,1,1,1,2
CDE,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5

END में for (key in keys) आउटपुट लाइनों के क्रम में फेरबदल कर सकता है। अगर यह कोई समस्या है तो इसे हल करने के लिए कई तरह के ट्वीक हैं। इसे 4 पर हार्ड-कोडिंग करने के बजाय maxVal की गणना करना भी तुच्छ होगा।

3
Ed Morton 23 अक्टूबर 2020, 02:46

सरणी और विभाजन फ़ंक्शन का उपयोग करके एक और अजीब

$ awk -F, ' BEGIN {OFS="," } NR>1 { k=$1 OFS $2;$1=$2=""; a[k]=a[k] OFS $0  } END { for(i in a) { printf("%s",i); for(j=1;j<=4;j++) { n=split(a[i],t,j); printf(",%s",n-1) } print "" } }  ' count_1234.txt
ABC,19-10-2020,0,1,2,2
ABC,18-10-2020,1,0,1,3
CDE,19-10-2020,1,1,1,2
CDE,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5
$

पठनीयता के लिए कई पंक्तियों में तोड़ना।

awk -F, ' BEGIN {OFS="," } 
NR>1 { k=$1 OFS $2;$1=$2=""; a[k]=a[k] OFS $0  } 
END { 
      for(i in a) 
      {    
            printf("%s",i); 
            for(j=1;j<=4;j++) 
             { 
                n=split(a[i],t,j); 
                printf(",%s",n-1) 
             } 
           print "" 
     } 
   }  '
1
stack0114106 24 अक्टूबर 2020, 07:29

क्या आप जीएनयू awk में दिखाए गए नमूनों के साथ निम्नलिखित, लिखित और परीक्षण करने का प्रयास कर सकते हैं।

awk '
BEGIN{
  FS=OFS=","
  print "Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4"
}
FNR>1{
  till=""
  delete arr
  for(i=3;i<=NF;i++){
    ind[$1 OFS $2]
    if($i!="NA"){ arr[$i]++; max_till=(max_till>$i?max_till:$i) }
  }
  till=(NF-3)
  for(j=1;j<=till;j++){
    value[$1 OFS $2 OFS j]+=arr[j]
  }
}
END{
  for(k in ind){
    printf("%s,",k)
    for(i=1;i<=max_till;i++){
      printf("%d%s",(value[k OFS i]?value[k OFS i]:0),i==max_till?ORS:OFS)
    }
  }
}' Input_file

आउटपुट निम्नानुसार होगा।

Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4
ABC,19-10-2020,0,1,2,2
ABC,18-10-2020,1,0,1,3
CDE,19-10-2020,1,1,1,2
CDE,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5
3
RavinderSingh13 23 अक्टूबर 2020, 16:46

यह awk भी काम करना चाहिए:

awk 'BEGIN {
   FS=OFS=","
}
NR > 1 {
   k=$1 OFS $2
   arr[k]
   for (i=3; i<=NF; ++i)
      ++freq[k OFS $i]
}
END {
   print "Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4"
   for (i in arr)
      print i, freq[i OFS 1]+0, freq[i OFS 2]+0,freq[i OFS 3]+0,freq[i OFS 4]+0
}' file.csv
Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4
ABC,19-10-2020,0,1,2,2
ABC,18-10-2020,1,0,1,3
CDE,19-10-2020,1,1,1,2
CDE,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5
3
anubhava 23 अक्टूबर 2020, 09:14

आपको awk को एक से अधिक बार कॉल करने की आवश्यकता नहीं है। आप बस घटनाओं और आउटपुट का योग करते हैं, उदा।

awk -F, '
    BEGIN { 
        OFS=","
        print "Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4"
        ones=twos=threes=fours=0
    }
    last && last != $1" "$2 {
        print $1,$2,ones,twos,threes,fours
        ones=twos=threes=fours=0
        last = $1" "$2
    }
    FNR > 1 {
        for (i=3; i<=NF; i++) {
            $i=="1" && ones++
            $i=="2" && twos++
            $i=="3" && threes++
            $i=="4" && fours++
        }
        last=$1" "$2
    }
    END {
        print $1,$2,ones,twos,threes,fours
    }
' file.csv

उदाहरण उपयोग/आउटपुट

$ awk -F, '
>     BEGIN {
>         OFS=","
>         print "Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4"
>         ones=twos=threes=fours=0
>     }
>     last && last != $1" "$2 {
>         print $1,$2,ones,twos,threes,fours
>         ones=twos=threes=fours=0
>         last = $1" "$2
>     }
>     FNR > 1 {
>         for (i=3; i<=NF; i++) {
>             $i=="1" && ones++
>             $i=="2" && twos++
>             $i=="3" && threes++
>             $i=="4" && fours++
>         }
>         last=$1" "$2
>     }
>     END {
>         print $1,$2,ones,twos,threes,fours
>     }
> ' file.csv
Name,Date,CountOF 1,CountOF 2,CountOF 3,CountOF 4
ABC,18-10-2020,0,1,2,2
CDE,19-10-2020,1,0,1,3
CDE,18-10-2020,1,1,1,2
FGH,18-10-2020,0,0,5,2
FGH,18-10-2020,0,0,0,5
3
David C. Rankin 22 अक्टूबर 2020, 21:57