如何使用awk按第3列排序

如何使用awk按第3列排序,awk,Awk,我有一个这样的文件(user.csv) ip,hostname,user,group,encryption,aduser,adattr 要按用户打印所有列排序 我尝试了awk-F:“{print |“$3 sort-n”}”user.csv,它不起作用。只排序如何 sort -t, -nk3 user.csv 在哪里 -t,-将分隔符定义为, -n-为您提供数字排序。添加,因为您已将其添加到 尝试。如果用户字段是纯文本,则不需要它 -k3-定义字段(键)。用户是第三个字段 使用awk将用

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

ip,hostname,user,group,encryption,aduser,adattr
要按用户打印所有列排序


我尝试了
awk-F:“{print |“$3 sort-n”}”user.csv
,它不起作用。

排序如何

sort -t, -nk3 user.csv
在哪里

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

  • -n
    -为您提供数字排序。添加,因为您已将其添加到 尝试。如果用户字段是纯文本,则不需要它

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

  • 使用awk将用户ID放在前面
  • 分类
  • 假设用户ID不包含任何空格,则使用sed删除重复的用户ID

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
  • 和相反的顺序

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

    您可以选择一个分隔符,在本例中,我选择了一个冒号并打印了第1列,按字母顺序排序:

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

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

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

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

    鉴于最初的问题是关于如何使用
    awk
    ,前7个答案中的每一个都使用
    sort
    ,而这是谷歌的热门话题,下面是如何使用
    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
       }
    }
    
    #/usr/bin/awk-f
    #用法:./sort.awk-v f=字段文件
    开始{
    FS=“,”
    }
    #每行
    { 
    a[NR]=$0“
    s[NR]=$f“
    }
    结束{
    isort(s,a,NR);
    
    对于(i=1;i
    sort-t,-k3 file
    如何使用排序2列?例如,我希望先按第6列排序,然后再按第3列排序。如果CSV中有带引号的字符串包含逗号,则此操作无效(除非您要排序的列早于包含逗号的列)。您可能必须首先通过awk(使用FPAT=“[^,]*\\”[^\“]*\”和OFS=“|”或其他可用于排序的分隔符)@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列文件除以逗号,谢谢JayPalt。这非常有用,特别是当您需要解析或合并列以添加排序字段,然后只保留原始行时。我使用awk/split解析/合并日期和时间字段以进行排序,然后删除。
    sort
    已经知道如何按特定列进行排序,但是当您要排序的字段不是一个定义良好的列时,这种技术(称为)非常有用。
    to
    排序是否使用内置的to
    awk
    ?如果不是,你知道为什么
    -V
    -
    版本排序在这里不起作用吗?另外,如果我选择不使用
    -t
    选项,似乎要选择第三列,我确实需要使用
    -k4
    -odd!
    awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
    
    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,-,-,-
    
    #!/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