【问题标题】:How to use awk sort by column 3如何使用awk按第3列排序
【发布时间】:2013-06-07 13:02:47
【问题描述】:

我有一个像这样的文件(user.csv)

ip,hostname,user,group,encryption,aduser,adattr

想要按用户排序打印所有列,

我试过awk -F ":" '{print|"$3 sort -n"}' user.csv,还是不行。

【问题讨论】:

  • sort -t, -k3 file

标签: awk


【解决方案1】:

使用 GNU awk:

awk -F ',' '{ a[$3]=$0 } END{ PROCINFO["sorted_in"]="@ind_str_asc"; for(i in a) print a[i] }' file

查看8.1.6 Using Predefined Array Scanning Orders with gawk了解更多排序算法。

【讨论】:

    【解决方案2】:

    鉴于最初的问题是关于如何使用 awk 而前 7 个答案中的每一个都使用 sort,而这是 Google 上的热门话题,这里是如何使用 awk .

    带有标题的示例 net.csv 文件:

    ip,hostname,user,group,encryption,aduser,adattr
    192.168.0.1,gw,router,router,-,-,-
    192.168.0.2,server,admin,admin,-,-,-
    192.168.0.3,ws-03,user,user,-,-,-
    192.168.0.4,ws-04,user,user,-,-,-
    

    还有 sort.awk:

    #!/usr/bin/awk -f
    # usage: ./sort.awk -v f=FIELD FILE
    
    BEGIN { 
       FS="," 
    }
    
    # each line
    { 
       a[NR]=$0 ""
       s[NR]=$f ""  
    }
    
    END {
       isort(s,a,NR); 
       for(i=1; i<=NR; i++) print a[i]
    }
    
    #insertion sort of A[1..n]
    function isort(S, A, n, i, j) {
       for( i=2; i<=n; i++) {
          hs = S[j=i]
          ha = A[j=i]
          while (S[j-1] > hs) { 
             j--; 
             S[j+1] = S[j]
             A[j+1] = A[j] 
          }
          S[j] = hs
          A[j] = ha
       }
    }
    

    使用它:

    awk sort.awk f=3 < net.csv  # OR 
    
    chmod +x sort.awk
    ./sort.awk f=3 net.csv
    

    【讨论】:

      【解决方案3】:
      awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
      

      这应该可行

      【讨论】:

        【解决方案4】:

        为了从排序中排除第一行(标题),我将它分成两个缓冲区。

        df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
        

        【讨论】:

          【解决方案5】:

          你可以选择一个分隔符,在这种情况下我选择了一个冒号并打印第一列,按字母顺序排序:

          awk -F\: '{print $1|"sort -u"}' /etc/passwd
          

          【讨论】:

            【解决方案6】:

            试试这个 -

            awk '{print $0|"sort -t',' -nk3 "}' user.csv
            

            sort -t',' -nk3 user.csv
            

            【讨论】:

            • |sort 是否使用内置到 awk?如果没有,知道为什么-V - version sort - 在这里不起作用吗?另外,如果我选择不使用-t 选项,似乎要选择第三列,我需要使用-k4 - 确实很奇怪!
            【解决方案7】:
            awk -F, '{ print $3, $0 }' user.csv | sort -nk2 
            

            逆序

            awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 
            

            【讨论】:

              【解决方案8】:
              1. 使用 awk 将用户 ID 放在前面。
              2. 排序
              3. 使用 sed 删除重复的用户 ID,假设用户 ID 不包含任何空格。

                awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
                

              【讨论】:

              • 这非常有用,特别是如果您需要解析或组合列以添加排序字段,然后只保留原始行。我使用 awk/split 来解析/组合日期和时间字段以进行排序,然后删除。
              • sort 已经知道如何按特定列进行排序,但是这种技术(称为Schwartzian transform)在您想要排序的字段不是一个很好的字段时很有用 -定义列。
              【解决方案9】:

              sort 怎么样。

              sort -t, -nk3 user.csv
              

              在哪里

              • -t, - 将您的分隔符定义为,

              • -n - 给你数字排序。自从您将其添加到您的 试图。如果您的用户字段仅为文本,那么您不需要它。

              • -k3 - 定义字段(键)。 user 是第三个字段。

              【讨论】:

              • 如何使用排序 2 列?例如,我想先按第 6 列排序,然后按第 3 列排序。
              • 如果在 CSV 中有包含逗号的引号字符串,这将不起作用(除非您要排序的列早于包含逗号的列)。您可能必须先通过 awk (使用 FPAT="[^,]*|\"[^\"]*\"" 和 OFS="|" 或您可以与 sort 一起使用的其他分隔符)
              • @user2452340 您可以这样做:sort -t, -nk3 filename.csv | sort -t, -nk6 - 首先它将按第 3 列排序,然后按第 6 列排序,因此第 6 列一直正确排序,并且对于第 6 列的任何行相同,将按第 3 列排序。
              • @Matthew sort -t ',' -k3,3n -k6,6n 会更好。 -k3 将使用第 3 列和该行的其余部分。
              • 我只需要 -t,将我的 2 列文件除以逗号,谢谢 jaypal
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-19
              • 1970-01-01
              • 2013-09-02
              • 1970-01-01
              • 2016-11-07
              • 2021-11-25
              相关资源
              最近更新 更多