如何使用awk按列3排序


89

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

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

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

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


11
sort -t, -k3 file
凯文

Answers:


173

那怎么样sort

sort -t, -nk3 user.csv

哪里

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

  • -n-给您数值排序。已添加,因为您尝试添加它。如果您的用户字段仅是文本,则不需要它。

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


2
如何使用排序2列?例如,我要先按第6列排序,然后再按第3列排序。
user2452340 2013年

1
如果CSV中包含引号的字符串中包含逗号,则此方法将无效(除非您要排序的列早于包含逗号的列)。您可能必须先使用awk进行通过(使用FPAT =“ [^,] * | \” [^ \“] * \”“和OFS =” |“或可用于排序的其他定界符)
davemyron 2015年

1
@ user2452340您可以执行以下操作:sort -t, -nk3 filename.csv | sort -t, -nk6-首先将按第3列排序,然后按第6列进行排序,因此第6列将一直正确排序,对于第6列相同的任何行,将按第3列进行排序。
马修

3
@Matthewsort -t ',' -k3,3n -k6,6n会更好。-k3将使用第3列和该行的其余部分。
库桑兰达

1
我只需要-t,将我的2列文件除以逗号即可,谢谢jaypal
Ricardo Rivera Nieves

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

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

这非常有用,特别是如果您需要解析或合并列以添加排序字段,然后仅保留原始行。我使用awk / split来解析/组合日期和时间字段以进行排序,然后将其删除。
skytaker

sort已经知道如何按特定的列进行排序,但是这种技术(称为Schwartzian变换)在您要对其进行排序的字段并非定义明确的列时很有用。
三人房

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

和相反的顺序

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

9

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

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

6

试试这个 -

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

要么

sort -t',' -nk3 user.csv

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

这应该工作


0

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

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.