【问题标题】:storing lines in an array awk将行存储在数组 awk 中
【发布时间】:2017-07-21 21:41:14
【问题描述】:

我有一个文件“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

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

【问题讨论】:

  • 如果你不关心输出格式,你甚至不需要awk。 sort -t, -k4,1 test 就像您描述的那样,将第 4 列然后第 1 列排序并向上排序(导致 1、4、2、6、5、3),但是 - 就像到目前为止的所有答案一样 - 这与您请求的输出不匹配( 1,2,4,6,3,5)。

标签: shell awk


【解决方案1】:

简单的 awk + sort 方法:

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

【讨论】:

    【解决方案2】:

    如果您使用 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 的说法,这是一个数组哈希。

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2020-01-17
      • 2017-03-05
      • 1970-01-01
      • 2014-07-27
      • 2020-12-14
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多