105

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

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

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

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

4

9 回答 9

205

怎么样sort

sort -t, -nk3 user.csv

在哪里

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

  • -n- 给你数字排序。添加,因为您在尝试中添加了它。如果您的用户字段仅为文本,那么您不需要它。

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

于 2013-06-11T15:39:48.153 回答
25
  1. 使用 awk 将用户 ID 放在前面。
  2. 种类
  3. 假设用户 ID 不包含任何空格,请使用 sed 删除重复的用户 ID。

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
于 2014-06-27T07:48:08.017 回答
12

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

awk -F\: '{print $1|"sort -u"}' /etc/passwd
于 2016-08-22T02:23:39.283 回答
10
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

和相反的顺序

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 
于 2016-07-26T15:57:40.103 回答
6

尝试这个 -

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

或者

sort -t',' -nk3 user.csv
于 2016-10-09T11:47:39.643 回答
6

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

要使用它:

awk sort.awk f=3 < net.csv  # OR 

chmod +x sort.awk
./sort.awk f=3 net.csv
于 2021-01-18T04:34:13.100 回答
4
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','

这应该工作

于 2020-05-24T17:42:13.210 回答
1

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

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
于 2020-03-25T02:19:41.690 回答
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 使用带有 gawk 的预定义数组扫描顺序。

于 2021-11-22T18:35:37.517 回答