Shell 在阵列awk中存储行

Shell 在阵列awk中存储行,shell,awk,Shell,Awk,我有一个文件testcat,下面是该文件的内容: a,s,d,e,g,h,j,k,l q,w,e,e,t,y,u,i,o,k,i z,x,c,f,b,n,m,a,s,j q,a,z,e,s,x,e,d,c,ty,yt w,s,c,f,d,c,r,f,v,o,o,o,y,i t,g,b,e,h,n,u,h,n 现在关于$4列,我必须将行保留在数组中,然后在最后打印相同的行: 输出应如下所示: e :: a,s,d,e,g,h,j,k,l e :: q,w,e,e,t,y,u,i,o,k,i e

我有一个文件testcat,下面是该文件的内容:

a,s,d,e,g,h,j,k,l
q,w,e,e,t,y,u,i,o,k,i
z,x,c,f,b,n,m,a,s,j
q,a,z,e,s,x,e,d,c,ty,yt
w,s,c,f,d,c,r,f,v,o,o,o,y,i
t,g,b,e,h,n,u,h,n
现在关于$4列,我必须将行保留在数组中,然后在最后打印相同的行:

输出应如下所示:

e :: a,s,d,e,g,h,j,k,l
e :: q,w,e,e,t,y,u,i,o,k,i
e :: q,a,z,e,s,x,e,d,c,ty,yt
e :: t,g,b,e,h,n,u,h,n
f :: z,x,c,f,b,n,m,a,s,j
f :: w,s,c,f,d,c,r,f,v,o,o,o,y,i
我用下面的命令通过awk完成,但没有得到正确的输出

awk -F"," '{sessions[$4]++;event_arr[$4][sessions[$4]]=$0; } END{ for ( i in sessions) {for (j in event_arr[i]) print i,"::",event_arr[i][j]}}'  test

#output
e :: t,g,b,e,h,n,u,h,n
e :: a,s,d,e,g,h,j,k,l
e :: q,w,e,e,t,y,u,i,o,k,i
e :: q,a,z,e,s,x,e,d,c,ty,yt
f :: z,x,c,f,b,n,m,a,s,j
f :: w,s,c,f,d,c,r,f,v,o,o,o,y,i
我用命令得到的问题是,我没有按正确的顺序获得输出。

简单的awk+排序方法:

awk -F, '{ print $4" :: "$0 }' test | sort -t,
输出:

e :: a,s,d,e,g,h,j,k,l
e :: q,a,z,e,s,x,e,d,c,ty,yt
e :: q,w,e,e,t,y,u,i,o,k,i
e :: t,g,b,e,h,n,u,h,n
f :: w,s,c,f,d,c,r,f,v,o,o,o,y,i
f :: z,x,c,f,b,n,m,a,s,j

如果使用GNU awk,则可以控制关联数组的遍历方式:

例如,在这里,您希望使用按数字排序的键扫描数组,因此

 awk -F, '
      {
          sessions[$4]++
          event_arr[$4][sessions[$4]]=$0
      }
      END {
          PROCINFO["sorted_in"] = "@ind_num_asc" 
          for ( i in sessions) 
              for (j in event_arr[i]) 
                  print i,"::",event_arr[i][j]
      }
  '  test
但是,这可能会破坏第4列的字母顺序

问题是您需要混合使用关联数组和数字索引数组。我会转向一种更为明确的语言,如perl:

perl -F, -ane '
    push @{$event{$F[3]}}, "$F[3] :: $_"
  } END {
    for $key (sort keys %event) {print join("", @{$event{$key}})}
' test
%事件是关联数组的哈希值。 $event{$key}是一个数字索引的数组。
用perl的说法,这是数组的散列。

如果不关心输出格式,甚至不需要awk。排序-t,-k4,1测试按照您描述的方式进行,先对第4列进行排序,然后再对第1列进行排序,最后得到1,4,2,6,5,3,但与目前为止的所有答案一样,这与您要求的输出1,2,4,6,3,5不匹配。