awk计数为1';S2&x27;s3&x27;s多列

awk计数为1';S2&x27;s3&x27;s多列,awk,Awk,想知道如何根据$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

想知道如何根据$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
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]}'

请您尝试使用GNU
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

请您尝试使用GNU
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

你永远不需要给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,'
开始{
OFS=“,”
打印“姓名、日期、计数1、计数2、计数3、计数4”
一=二=三=四=0
}
最后一个和最后一个!=$1" "$2 {
打印1美元、2美元、1美元、2美元、3美元、4美元
一=二=三=四=0
最后=$1”“$2
}
FNR>1{
对于(i=3;我开始{
>OFS=“,”
>打印“姓名、日期、计数1、计数2、计数3、计数4”
>一=二=三=四=0
>     }
>last&&last!=$1”“$2{
>打印1美元、2美元、1美元、2美元、3美元、4美元
>一=二=三=四=0
>最后=$1”“$2
>     }
>FNR>1{
>对于(i=3;i$i==“1”&&1)++
>$i==“2”和两个++
>$i==“3”和三++
>$i==“4”和四++
>         }
>最后=$1”“$2
>     }
>结束{
>打印1美元、2美元、1美元、2美元、3美元、4美元
>     }
>'file.csv
姓名、日期、计数1、计数2、计数3、计数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,5

您永远不需要多次调用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,'
开始{
OFS=“,”
打印“姓名、日期、计数1、计数2、计数3、计数4”
一=二=三=四=0
}
last&&last!=$1”“$2{
打印1美元、2美元、1美元、2美元、3美元、4美元
一=二=三=四=0
最后=$1”“$2
}
FNR>1{
对于(i=3;我开始{
>OFS=“,”
>打印“姓名、日期、计数1、计数2、计数3、计数4”
>一=二=三=四=0
>     }
>last&&last!=$1”“$2{
>打印1美元、2美元、1美元、2美元、3美元、4美元
>一=二=三=四=0
>最后=$1”“$2
>     }
>FNR>1{
>对于(i=3;i$i==“1”&&1)++
>$i==“2”和两个++
>$i==“3”和三++
>$i==“4”和四++
>         }
>最后=$1”“$2
>     }
>结束{
>打印1美元、2美元、1美元、2美元、3美元、4美元
>     }
>'file.csv
姓名、日期、计数1、计数2、计数3、计数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,5

此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

该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
最后的
for(key-in-keys)
可以改变输出行的顺序。如果这是一个问题,可以通过各种调整来解决。计算
maxVal
而不是将其硬编码为4也很简单


最后的
for(key-in-keys)
可以改变输出行的顺序。如果这是一个问题,可以通过各种调整来解决。计算
maxVal
而不是将其硬编码为4也很简单。

使用数组和拆分函数的另一个awk

$ 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 of s$2;$1=$2=“”;a[k]=a[k]of s$0}END{for(i in a){printf(“%s”,i);for(j=1;j1{k=$1 of s$2;$1=$2=“”;a[k]=a[k]of s$0}
结束{
为了(我在a)
{    
printf(“%s”,i);

对于(j=1;j另一个使用数组和拆分函数的awk

$ 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 of s$2;$1=$2=“”;a[k]=a[k]of s$0}END{for(i in a){printf(“%s”,i);for(j=1;j1{k=$1 of s$2;$1=$2=“”;a[k]=a[k]of s$0}
结束{
为了(我在a)
{    
printf(“%s”,i);

对于(j=1;j数组和函数的使用是一种非常好的方法!哦,是的,没错。我应该考虑一下。数组和函数的使用是一种非常好的方法!哦,是的,没错。我应该考虑一下。数组的使用是一种整洁的方法。很好。数组的使用是一种整洁的方法。很好。不使用数组的使用肯定会更有效不使用数组肯定更有效++
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 "" 
     } 
   }  '