【发布时间】: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
我有一个像这样的文件(user.csv)
ip,hostname,user,group,encryption,aduser,adattr
想要按用户排序打印所有列,
我试过awk -F ":" '{print|"$3 sort -n"}' user.csv,还是不行。
【问题讨论】:
sort -t, -k3 file
标签: awk
使用 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了解更多排序算法。
【讨论】:
鉴于最初的问题是关于如何使用 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
【讨论】:
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
这应该可行
【讨论】:
为了从排序中排除第一行(标题),我将它分成两个缓冲区。
df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
【讨论】:
你可以选择一个分隔符,在这种情况下我选择了一个冒号并打印第一列,按字母顺序排序:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
【讨论】:
试试这个 -
awk '{print $0|"sort -t',' -nk3 "}' user.csv
或
sort -t',' -nk3 user.csv
【讨论】:
| 到 sort 是否使用内置到 awk?如果没有,知道为什么-V - version sort - 在这里不起作用吗?另外,如果我选择不使用-t 选项,似乎要选择第三列,我需要使用-k4 - 确实很奇怪!
awk -F, '{ print $3, $0 }' user.csv | sort -nk2
逆序
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
【讨论】:
使用 sed 删除重复的用户 ID,假设用户 ID 不包含任何空格。
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
【讨论】:
sort 已经知道如何按特定列进行排序,但是这种技术(称为Schwartzian transform)在您想要排序的字段不是一个很好的字段时很有用 -定义列。
sort 怎么样。
sort -t, -nk3 user.csv
在哪里
-t, - 将您的分隔符定义为,。
-n - 给你数字排序。自从您将其添加到您的
试图。如果您的用户字段仅为文本,那么您不需要它。
-k3 - 定义字段(键)。 user 是第三个字段。
【讨论】:
sort -t, -nk3 filename.csv | sort -t, -nk6 - 首先它将按第 3 列排序,然后按第 6 列排序,因此第 6 列一直正确排序,并且对于第 6 列的任何行相同,将按第 3 列排序。
sort -t ',' -k3,3n -k6,6n 会更好。 -k3 将使用第 3 列和该行的其余部分。