将行存储在数组awk中

时间:2017-07-21 09:54:40

标签: shell awk

我有一个文件“test”cat,下面是文件的内容:

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

问题是,我得到的命令是我没有按正确顺序输出。

3 个答案:

答案 0 :(得分:1)

简单 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

答案 1 :(得分:0)

再试一次awk方法,让我知道这是否对你有帮助。

awk -F, '{print $4,"::",$0 | "sort -k1"}'   Input_file

答案 2 :(得分:0)

如果你正在使用GNU awk,你可以控制遍历关联数组的方式:https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html#Controlling-Scanning

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

 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是一个哈希(一个关联数组) $event{$key}是一个数组(数字索引) 用perl的说法,这是一个数组哈希。