awk计数为1';S2&x27;s3&x27;s多列
想知道如何根据$1和$2组合计算,从$3、4、5、6和$7计算1、2、3和4的出现次数 样本输入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
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 ""
}
} '