如何使用第3列的awk排序

时间:2013-06-11 15:37:28

标签: awk

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

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

希望按用户打印所有列排序

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

8 个答案:

答案 0 :(得分:128)

sort怎么样?

sort -t, -nk3 user.csv

其中

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

  • -n - 为您提供数字排序。自从您添加它后添加 尝试。如果您的用户字段仅为文本,那么您不需要它。

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

答案 1 :(得分:12)

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

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

答案 2 :(得分:7)

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

和反向订单

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:5)

试试这个 -

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

OR

sort -t',' -nk3 user.csv

答案 5 :(得分:3)

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

这应该有效

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

看到最初的问题是关于如何使用 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