Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk计数总和和唯一改善命令-Con:_Awk - Fatal编程技术网

awk计数总和和唯一改善命令-Con:

awk计数总和和唯一改善命令-Con:,awk,Awk,要根据第二列和第四列、行项目计数、第三列和第一列的唯一值打印 Input.csv abc,xx,5,Jan-2014 abc,yy,10,Jan-2014 def,xx,15,Jan-2014 def,yy,20,Jan-2014 abc,xx,5,Jan-2014 abc,yy,10,Jan-2014 def,xx,15,Jan-2014 def,yy,20,Jan-2014 ghi,zz,10,Jan-2014 abc,xx,5,Feb-2014 abc,yy,10,Feb-2014 def

要根据第二列和第四列、行项目计数、第三列和第一列的唯一值打印

Input.csv

abc,xx,5,Jan-2014
abc,yy,10,Jan-2014
def,xx,15,Jan-2014
def,yy,20,Jan-2014
abc,xx,5,Jan-2014
abc,yy,10,Jan-2014
def,xx,15,Jan-2014
def,yy,20,Jan-2014
ghi,zz,10,Jan-2014
abc,xx,5,Feb-2014
abc,yy,10,Feb-2014
def,xx,15,Feb-2014
def,yy,20,Feb-2014
abc,xx,5,Feb-2014
abc,yy,10,Feb-2014
def,xx,15,Feb-2014
def,yy,20,Feb-2014
ghi,zz,10,Feb-2014
尝试#1:

尝试#2:

尝试#3:

期望输出:

xx,Jan-2014,4,40,2
yy,Jan-2014,4,60,2
zz,Jan-2014,1,10,1
xx,Feb-2014,4,40,2
yy,Feb-2014,4,60,2
zz,Feb-2014,1,10,1
寻找你的建议

试试看:

awk '{i=$2 FS $4; S[i]+=$3} !A[$1,i]++{C[i]++} END{for(i in S) print i, S[i], C[i]}' FS=, OFS=, file
多行:

awk '
  BEGIN {
    FS=OFS=","
  }

  {
    idx=$2 FS $4
    Sum[idx]+=$3
  }

  !Seen[$1,idx]++ {
    Count[idx]++
  }

  END {
    for(idx in Sum) print idx, Sum[idx], Count[idx]
  }
' file
输出:

xx,Feb-2014,40,2
zz,Feb-2014,10,1
yy,Feb-2014,60,2
yy,Jan-2014,60,2
xx,Jan-2014,40,2
zz,Jan-2014,10,1
尝试:

多行:

awk '
  BEGIN {
    FS=OFS=","
  }

  {
    idx=$2 FS $4
    Sum[idx]+=$3
  }

  !Seen[$1,idx]++ {
    Count[idx]++
  }

  END {
    for(idx in Sum) print idx, Sum[idx], Count[idx]
  }
' file
输出:

xx,Feb-2014,40,2
zz,Feb-2014,10,1
yy,Feb-2014,60,2
yy,Jan-2014,60,2
xx,Jan-2014,40,2
zz,Jan-2014,10,1
尝试:

多行:

awk '
  BEGIN {
    FS=OFS=","
  }

  {
    idx=$2 FS $4
    Sum[idx]+=$3
  }

  !Seen[$1,idx]++ {
    Count[idx]++
  }

  END {
    for(idx in Sum) print idx, Sum[idx], Count[idx]
  }
' file
输出:

xx,Feb-2014,40,2
zz,Feb-2014,10,1
yy,Feb-2014,60,2
yy,Jan-2014,60,2
xx,Jan-2014,40,2
zz,Jan-2014,10,1
尝试:

多行:

awk '
  BEGIN {
    FS=OFS=","
  }

  {
    idx=$2 FS $4
    Sum[idx]+=$3
  }

  !Seen[$1,idx]++ {
    Count[idx]++
  }

  END {
    for(idx in Sum) print idx, Sum[idx], Count[idx]
  }
' file
输出:

xx,Feb-2014,40,2
zz,Feb-2014,10,1
yy,Feb-2014,60,2
yy,Jan-2014,60,2
xx,Jan-2014,40,2
zz,Jan-2014,10,1

如果输出顺序至关重要,则可以执行以下操作:

awk '
BEGIN { SUBSEP = FS = OFS = "," }
!seen[$1,$2,$4]++ { count[$2,$4]++ } 
!patt[$2,$4]++    { order[++nr] = $2 FS $4 }
{ values[$2,$4]++; sum[$2,$4]+=$3 } 
END { 
    for (idx=1; idx<=nr; idx++) 
        print order[idx], values[order[idx]], sum[order[idx]], count[order[idx]] 
}' file 
xx,Jan-2014,4,40,2
yy,Jan-2014,4,60,2
zz,Jan-2014,1,10,1
xx,Feb-2014,4,40,2
yy,Feb-2014,4,60,2
zz,Feb-2014,1,10,1
awk'
开始{SUBSEP=FS=OFS=“,”}
!看到[$1,$2,$4]+{count[$2,$4]+}
!patt[$2,$4]+{order[++nr]=$2fs$4}
{值[$2,$4]++;和[$2,$4]+=$3}
结束{

对于(idx=1;idx如果输出顺序至关重要,则可以执行以下操作:

awk '
BEGIN { SUBSEP = FS = OFS = "," }
!seen[$1,$2,$4]++ { count[$2,$4]++ } 
!patt[$2,$4]++    { order[++nr] = $2 FS $4 }
{ values[$2,$4]++; sum[$2,$4]+=$3 } 
END { 
    for (idx=1; idx<=nr; idx++) 
        print order[idx], values[order[idx]], sum[order[idx]], count[order[idx]] 
}' file 
xx,Jan-2014,4,40,2
yy,Jan-2014,4,60,2
zz,Jan-2014,1,10,1
xx,Feb-2014,4,40,2
yy,Feb-2014,4,60,2
zz,Feb-2014,1,10,1
awk'
开始{SUBSEP=FS=OFS=“,”}
!看到[$1,$2,$4]+{count[$2,$4]+}
!patt[$2,$4]+{order[++nr]=$2fs$4}
{值[$2,$4]++;和[$2,$4]+=$3}
结束{

对于(idx=1;idx如果输出顺序至关重要,则可以执行以下操作:

awk '
BEGIN { SUBSEP = FS = OFS = "," }
!seen[$1,$2,$4]++ { count[$2,$4]++ } 
!patt[$2,$4]++    { order[++nr] = $2 FS $4 }
{ values[$2,$4]++; sum[$2,$4]+=$3 } 
END { 
    for (idx=1; idx<=nr; idx++) 
        print order[idx], values[order[idx]], sum[order[idx]], count[order[idx]] 
}' file 
xx,Jan-2014,4,40,2
yy,Jan-2014,4,60,2
zz,Jan-2014,1,10,1
xx,Feb-2014,4,40,2
yy,Feb-2014,4,60,2
zz,Feb-2014,1,10,1
awk'
开始{SUBSEP=FS=OFS=“,”}
!看到[$1,$2,$4]+{count[$2,$4]+}
!patt[$2,$4]+{order[++nr]=$2fs$4}
{值[$2,$4]++;和[$2,$4]+=$3}
结束{

对于(idx=1;idx如果输出顺序至关重要,则可以执行以下操作:

awk '
BEGIN { SUBSEP = FS = OFS = "," }
!seen[$1,$2,$4]++ { count[$2,$4]++ } 
!patt[$2,$4]++    { order[++nr] = $2 FS $4 }
{ values[$2,$4]++; sum[$2,$4]+=$3 } 
END { 
    for (idx=1; idx<=nr; idx++) 
        print order[idx], values[order[idx]], sum[order[idx]], count[order[idx]] 
}' file 
xx,Jan-2014,4,40,2
yy,Jan-2014,4,60,2
zz,Jan-2014,1,10,1
xx,Feb-2014,4,40,2
yy,Feb-2014,4,60,2
zz,Feb-2014,1,10,1
awk'
开始{SUBSEP=FS=OFS=“,”}
!看到[$1,$2,$4]+{count[$2,$4]+}
!patt[$2,$4]+{order[++nr]=$2fs$4}
{值[$2,$4]++;和[$2,$4]+=$3}
结束{

对于(idx=1;idx@EdMorton是的,这是一个很好的建议。使用由
subsp
分隔的组合键总是能帮我完成任务,所以我从来没有真正使用过
awk
中的真正多维数组。我想我应该开始读它了。
:)
2-D数组对于许多常见应用程序非常有用。类似于使用伪2d数组在多行上读取公共密钥的val的应用程序:
a[$1]=($1 in a?a[$1]RS:)$2;…END{for(key in a){split(a[key],tmp,RS);for(i=1;i in tmp;i++){val=tmp[i];print key,val}}
使用true-2d数组变得更简单:
a[$1][$2];…END{for(a中的键)for(a中的val])打印键,val}
。可能有语法错误或2个,但你明白了。让我们一起来。@EdMorton是一个好建议。使用由
子集隔开的复合键总是能帮我完成任务,所以我从来没有真正在
awk
中使用过真正的多维数组。我想我应该开始阅读它。
:)
2-D数组对于许多常见应用程序非常有用。类似于使用伪2d数组在多行上读取公共密钥的val的应用程序:
a[$1]=($1 in a?a[$1]RS:)$2;…END{for(key in a){split(a[key],tmp,RS);for(i=1;i in tmp;i++){val=tmp[i];print key,val}}
使用true-2d数组变得更简单:
a[$1][$2];…END{for(a中的键)for(a中的val])打印键,val}
。可能有语法错误或2个,但你明白了。让我们一起来。@EdMorton是一个好建议。使用由
子集隔开的复合键总是能帮我完成任务,所以我从来没有真正在
awk
中使用过真正的多维数组。我想我应该开始阅读它。
:)
2-D数组对于许多常见应用程序非常有用。类似于使用伪2d数组在多行上读取公共密钥的val的应用程序:
a[$1]=($1 in a?a[$1]RS:)$2;…END{for(key in a){split(a[key],tmp,RS);for(i=1;i in tmp;i++){val=tmp[i];print key,val}}
使用true-2d数组变得更简单:
a[$1][$2];…END{for(a中的键)for(a中的val])打印键,val}
。可能有语法错误或2个,但你明白了。让我们一起来。@EdMorton是一个好建议。使用由
子集隔开的复合键总是能帮我完成任务,所以我从来没有真正在
awk
中使用过真正的多维数组。我想我应该开始阅读它。
:)
2-D数组对于许多常见应用程序非常有用。类似于使用伪2d数组在多行上读取公共密钥的val的应用程序:
a[$1]=($1 in a?a[$1]RS:)$2;…END{for(key in a){split(a[key],tmp,RS);for(i=1;i in tmp;i++){val=tmp[i];print key,val}}
使用true-2d数组变得更简单:
a[$1][$2];…END{for(a中的键)for(a中的val])print key,val}
。可能有语法错误,或者其中有2个,但您明白了。让我们来看看。